QT线程二(线程的同步).docx

上传人:scccc 文档编号:12440903 上传时间:2021-12-03 格式:DOCX 页数:12 大小:31.67KB
返回 下载 相关 举报
QT线程二(线程的同步).docx_第1页
第1页 / 共12页
QT线程二(线程的同步).docx_第2页
第2页 / 共12页
QT线程二(线程的同步).docx_第3页
第3页 / 共12页
QT线程二(线程的同步).docx_第4页
第4页 / 共12页
QT线程二(线程的同步).docx_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《QT线程二(线程的同步).docx》由会员分享,可在线阅读,更多相关《QT线程二(线程的同步).docx(12页珍藏版)》请在三一文库上搜索。

1、QT线程二(线程的同步)QT线程(二)一线程同步线程互斥多线程运行时,通常会访问同一个变量,同一个数据结构,或者同一段代码。因此,需要使用互斥技术来保护上述资源,确保多线程执行的正确性。注:我们通常说某个函数是线程安全的,也就是因为该函数实现加入了线程互斥保护。4.1、QMutexQMutex ( RecursionMode mode = NonRecursive )QMutex ()void lock ()mutex加锁,如果当前其他线程己对该mutex加锁了,则该调用被阻塞直到其他线程释放该mutex。bool tryLock ()mutex加锁,和lock不同的是,如果当前其他线程已对该

2、mutex加锁了,则该调用会立即返回,而不被阻塞。bool tryLock ( int timeout )同tryLock,和tryLock不同的是,如果当前其他线程已对该mutex加锁了,则该调用会等待一段时间,直到超时或者其他线程释放了 mutexovoid unlock ()mutex解锁,释放被锁住的资源。Mutex有两种模式,用户可以在构造函数参数中指定。ConstantValueDescriptionQMutex:Recursive1In this mode, a thread can lock the same mutex multiple times and the mutex

3、 won't be unlocked until a corresponding number of unlock() calls have been made.该模式下,一个线程可以对mutex多次 lock,直到相应次数的unlock,调用后, 该mutex才真正被unlockoQMutex:NonRecursive0In this mode, a thread may only lock a mutex once.该模式下,mutex只能被lock 一次。实例:QMutex mutex;int number = 6;void methodi ()mutex. lock();num

4、ber *= 5;number /= 4; mutex, unlock ();)void method2 0mutex. lock();number *= 3;number /- 2;mutex, unlock ();4.1、QMutexLockerQMutexLocker ( QMutex * mutex ) QMutexLocker ()QMutex * mutex () const void relock () void unlock ()QMutexLocker实际上是对QMutex使用的一种简化。例如以下场景:当某段代码存在多个分支,在对QMutex加锁后,需要在不同的分支路径 下都

5、执行解锁操作,才能保证Mutex关联的资源能被其他线程继续访问,否则就 出现死锁。QMutexLocker接收一个QMutex作为参数,当创建QMutexLocker对象时, 就对关联的Mutex进行了 Lock操作,直到该QMutexLocker对象被销毁,相 关的 QMutex 才被 Unlock,实例:直接使用QMutex:int comp1exFunction(int flag)mutex, lock ();int retVal = 0;switch (flag) case 0:case 1:mutex, unlock ();return moreComplexFunction(fla

6、g);case 2:(int status 二 anotherFunction();if (status < 0) mutex, un lock ();return -2;)flag;retVal = status +break;default:if (flag > 10) mutex, unlock ();return T;)break;)mutex, unlock ();return retVal;)使用 QMutexLocker:int comp1exFunction(int flag)(QMutexLocker locker(&mutex);int retVal =

7、 0;switch (flag) case 0:case 1:return moreComplexFunction(flag);case 2:(int status 二 anotherFunction();if (status < 0)return-2;retVal = status + flag;break;default:if (flag > 10)return -1;break;)return retVal;当然,使用QMutexLocker时,也需要注意QMutexLocker对象的生存周期, 否则可能会出现锁时间过长,或者锁住的资源过多。43、QReadLocker>

8、; QWriteLocker> QReadVVriteLocker还有一种场景,我们所保护的资源是具有读写权限的,多个线程可以同时读 取某个资源,但是当存在写操作,写操作未完成时,就不允许其他线程对该资 源进行读操作。QReadWriteLock ()QReadWriteLock ( RecursionMode recurslonMode )QReadWriteLock ()void lockForRead ()void lockForWrite ()bool tryLockForRead ()bool tryLockForRead ( int timeout )bool tryLock

9、ForWrite ()bool tryLockForWrite ( int timeout )void unlock ()QReadLocker ( QReadWriteLock * lock ) QReadLocker ()QReadWriteLock5 八readWriteLock () const * void relock () void unlock ()QWriteLocker ( QReadWriteLock * lock )QWr it eLocker ()QReadWriteLockf - 八readWriteLock () const * void relock () vo

10、id unlock ()实例:QReadWriteLock lock;void ReaderThread:run()lock. lockForRead ();read_file ();lock, unlock ();void WriterThread: :run()lock. lockForWrite (); write_file ();lock, unlock ();4.4、QSemaphore和QMutex不同的是,QSemaphore 一次可以对多个资源进行保护,例如以下场景:某工厂只有固定仓位,生产人员每天生产的产品数量不一,销售人员每 天销售的产品数量也不一致。当生产人员生产P个产品

11、时,就一次需要P个仓 位,当销售人员销售C个产品时,就要求仓库中有足够多的产品才能销售。如果剩余仓位没有P个时,该批次的产品都不存入,当当前已有的产品没有 C个时,就不能销售C个以上的产品,直到新产品加入后方可销售。这就是典型的生产者-消费者问题。QSemaphore ( int n = 0 ) Semaphore () void acquire ( int n = 1 ) int available () const void release ( int n = 1 ) bool tryAcquire ( int n = 1 )bool tryAcquire ( int n9 int tim

12、eout )实例:QSemaphore sem(5);sem. available () = 5/默认有5个产品sem. acquire(3);sem. available () = 2功/销售3个产品,成sem. acquire(2);sem. available () = 0销售2个产品成功/生产5个产品sem. release(5);sem. available () = 5sem. release(5);sem. available () = 10 生产 10 个产品sem. tryAcquire(1);sem. available () = 9, returns true 消费 1个产品,成功sem. tryAcquire(250);/sem. available () = 9, re turns false 企图销 售250个产品,失败,因为当前只剩下14个产

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1