线程互斥
多线程运行时,通常会访问同一个变量,同一个数据结构,或者同一段代码。因此,需要使用互斥技术来保护上述资源,确保多线程执行的正确性。
注:
我们通常说某个函数是线程安全的,也就是因为该函数实现加入了线程互斥保护。
4.1、QMutex
|
QMutex ( RecursionMode mode = NonRecursive ) |
|
~QMutex () |
void |
lock () mutex加锁,如果当前其他线程已对该mutex加锁了,则该调用被阻塞直到其他线程释放该mutex。 |
bool |
tryLock () mutex加锁,和lock不同的是,如果当前其他线程已对该mutex加锁了,则该调用会立即返回,而不被阻塞。 |
bool |
tryLock ( int timeout ) 同tryLock,和tryLock不同的是,如果当前其他线程已对该mutex加锁了,则该调用会等待一段时间,直到超时或者其他线程释放了mutex。 |
void |
unlock () mutex解锁,释放被锁住的资源。 |
Mutex有两种模式,用户可以在构造函数参数中指定。
Constant |
Value |
Description |
QMutex::Recursive |
1 |
In this mode, a thread can lock the same mutex multiple times and the mutex won't be unlocked until a corresponding number of unlock() calls have been made. 该模式下,一个线程可以对mutex多次lock,直到相应次数的unlock,调用后,该mutex才真正被unlock。 |
QMutex::NonRecursive |
0 |
In this mode, a thread may only lock a mutex once. 该模式下,mutex只能被lock一次。 |
实例:
QMutex mutex;
int number = 6;
void method1()
{