QT线程二(线程的同步)_第1页
QT线程二(线程的同步)_第2页
QT线程二(线程的同步)_第3页
QT线程二(线程的同步)_第4页
QT线程二(线程的同步)_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

QT 线程 二 线程同步 线程互斥 多线程运行时 通常会访问同一个变量 同一个数据结构 或者同一段代 码 因此 需要使用互斥技术来保护上述资源 确保多线程执行的正确性 注 我们通常说某个函数是线程安全的 也就是因为该函数实现加入了线程 互斥保护 4 1 QMutex QMutexQMutex RecursionMode mode NonRecursive QMutex QMutex void locklock mutex 加锁 如果当前其他线程已对该 mutex 加锁了 则该调用被阻塞直到其他线程释放该 mutex bool tryLocktryLock mutex 加锁 和 lock 不同的是 如果当前其他线程已对该 mutex 加锁了 则该调用会立即返回 而不被阻塞 bool tryLocktryLock int timeout 同 tryLock 和 tryLock 不同的是 如果当前其他线程已对该 mutex 加锁了 则该调用会等待一段时间 直到超时或者其他线程释放了 mutex void unlockunlock mutex 解锁 释放被锁住的资源 Mutex 有两种模式 用户可以在构造函数参数中指定 ConstantConstantValueValueDescriptionDescription QMutex Recursive1In 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 NonRecursive0In this mode a thread may only lock a mutex once 该模式下 mutex 只能被 lock 一次 实例 QMutex mutex int number 6 void method1 mutex lock number 5 number 4 mutex unlock void method2 mutex lock number 3 number 2 mutex unlock 4 1 QMutexLocker QMutexLockerQMutexLocker QMutex mutex QMutexLocker QMutexLocker QMutex mutexmutex const void relockrelock void unlockunlock QMutexLocker 实际上是对 QMutex 使用的一种简化 例如以下场景 当某段代码存在多个分支 在对 QMutex 加锁后 需要在不同的分支路径 下都执行解锁操作 才能保证 Mutex 关联的资源能被其他线程继续访问 否则 就出现死锁 QMutexLocker 接收一个 QMutex 作为参数 当创建 QMutexLocker 对象时 就对关联的 Mutex 进行了 Lock 操作 直到该 QMutexLocker 对象被销毁 相关 的 QMutex 才被 Unlock 实例 直接使用 QMutex int complexFunction int flag mutex lock int retVal 0 switch flag case 0 case 1 mutex unlock return moreComplexFunction flag case 2 int status anotherFunction if status 10 mutex unlock return 1 break mutex unlock return retVal 使用 QMutexLocker int complexFunction int flag QMutexLocker locker int retVal 0 switch flag case 0 case 1 return moreComplexFunction flag case 2 int status anotherFunction if status 10 return 1 break return retVal 当然 使用 QMutexLocker 时 也需要注意 QMutexLocker 对象的生存周期 否 则可能会出现锁时间过长 或者锁住的资源过多 4 3 QReadLocker QWriteLocker QReadWriteLocker 还有一种场景 我们所保护的资源是具有读写权限的 多个线程可以同时 读取某个资源 但是当存在写操作 写操作未完成时 就不允许其他线程对该 资源进行读操作 QReadWriteLockQReadWriteLock QReadWriteLockQReadWriteLock RecursionMode recursionMode QReadWriteLock QReadWriteLock void lockForReadlockForRead void lockForWritelockForWrite bool tryLockForReadtryLockForRead bool tryLockForReadtryLockForRead int timeout bool tryLockForWritetryLockForWrite bool tryLockForWritetryLockForWrite int timeout void unlockunlock QReadLockerQReadLocker QReadWriteLock lock QReadLocker QReadLocker QReadWriteLock readWriteLockreadWriteLock const void relockrelock void unlockunlock QWriteLockerQWriteLocker QReadWriteLock lock QWriteLocker QWriteLocker QReadWriteLock readWriteLockreadWriteLock const void relockrelock void unlockunlock 实例 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 个产品时 就一次需要 P 个仓 位 当销售人员销售 C 个产品时 就要求仓库中有足够多的产品才能销售 如果剩余仓位没有 P 个时 该批次的产品都不存入 当当前已有的产品没 有 C 个时 就不能销售 C 个以上的产品 直到新产品加入后方可销售 这就是典型的生产者 消费者问题 QSemaphoreQSemaphore int n 0 QSemaphore QSemaphore void acquireacquire int n 1 int availableavailable const void releaserelease int n 1 bool tryAcquiretryAcquire int n 1 bool tryAcquiretryAcquire int n int timeout 实例 QSemaphore sem 5 sem available 5 默认有 5 个产品 sem acquire 3 sem available 2 销售 3 个产品 成功 sem acquire 2 sem available 0 销售 2 个产品成功 sem release 5 sem available 5 生产 5

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论