需求
多线程同步时,需要线程能够被外部唤醒,从而按照一定的顺序来执行。
解决
- 同步可以使用
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(含源码+注释)