需求

多线程同步时,需要线程能够被外部唤醒,从而按照一定的顺序来执行。

解决

  • 同步可以使用 QWaitCondition 先让线程睡眠,然后在必要的时候从外面唤醒

线程即可。但是 QWaitCondition 所在的线程必须先使用 QMutex 上锁才行, QWaitCondition 会先阻塞线程,然后把锁释放,再等待唤醒,唤醒可以对 QWaitCondition 的对象使用 wakeAll() 或者 wakeOne() , 唤醒后,锁会自动回来,所以别忘了最后的解锁.

  • QMutex 除了直接的 lock, 还可以使用 QMutexLocker 自动上锁,并在生命周期结束后自动解锁。
m_mutex.lock();
m_cond.wait(&m_mutex);
...
m_mutex.unlock();
const QMutexLocker locker(&m_mutex);
...
m_cond.wakeOne();

参考

Qt互斥锁(QMutex)、条件变量(QWaitCondition)理解+QMutex实现多线程循环输出ABC(含源码+注释)

QT线程QMutex和 QWaitCondition 结合使用的例子