[Qt 线程同步--条件变量]
QT 信号量和条件变量都是同步的工具。
Qt 的条件变量对象为 QWaitCondition,条件变量允许一个线程通知其他的线程它们所等待的某个条件已经满足了,可以继续运行了。
一个或多个线程可以在同一个条件变量上等待(QWaitCondition::wait() 阻塞式,防止线程空跑)。当条件满足时,我们可以调用wakeOne()从所有等待在该条件变量上的线程中随机的唤醒一个线程继续运行,也可以使用wakeAll()方法同时唤醒所有等待在该条件变量上的线程。
QWaitCondition::wait() 在使用时必须传入一个上锁的 QMutex 对象。这是很有必要的。
根据 Qt 手册,wait() 函数必须传入一个已上锁的 mutex 对象,在 wait() 执行过程中,mutex一直保持上锁状态,直到调用操作系统的wait_block 在阻塞的一瞬间把 mutex 解锁(严格说来应该是原子操作,即系统能保证在真正执行阻塞等待指令时才解锁)。另一线程唤醒后,wait() 函数将在第一时间重新给 mutex 上锁(这种操作也是原子的),直到显示调用 mutex.unlock() 解锁。
下面使用常见的生产者-消费者问题来演示一下条件变量的使用。
- 全局变量
- 新建一个Qt控制台程序,再新建两个线程类Producer和Consumer,继承自QThread类。
- 简单调用