目录
多个线程同时访问共享数据时可能会冲突,出现意料之外的结果,这源于操作的原子性问题,关于操作原子性可问度娘,这里不多做解释。
保证线程间同步的方法有:
c++ | Qt | |
互斥锁 | QMute | |
条件变量 | QWaitCondition | |
信号量 | QSemaphore | |
读写锁 | QReadLocker、QWriteLocker、QReadWriteLock |
1. 互斥锁QMutex
使用场景:多个线程同时访问共享数据时可能发生冲突
基本功能:上锁、解锁(且同一时间只能有一个线程上锁)
使用mutex.lock()和mutex.unlock()来锁住两个以上的资源块,这样CPU在进行线程调度,切换到这些资源块时会判断互斥锁mutex是否能上锁,若能,则上锁,并执行该资源块,否则进入阻塞状态,将执行权交由其它线程,等下次调度到该线程再次判断是否能上锁,按此规律直到获取到锁,或进入死锁状态。
另外还有trylock(int time=0)函数,该函数用于尝试获取锁,并可以设置未获取到锁的等待时间,与lock()不同的是,trylock()函数不会使线程一直阻塞,而lock()函数的超时间是无穷大,即未获取到锁会一直阻塞(我认为这是死锁的最重要因素,关于死锁,后面会介绍)
其它操作类:QMutexLocker,提供便捷的加解锁操作,在其创建时加锁,析构时自动解锁,详细如下。
int complexFunction(int flag)
{
QMutexLocker locker(&mutex); //加锁只需要由mutex创建一个QMutexLocker对象
int retVal = 0;
switch (flag) {
case 0:
case 1:
return moreComplexFunction(flag); //1
case 2:
{
int status = anotherFunction();
if (status &