QWaitConditon使用流程
1.等待条件的线程调用QWaitCondition::wait()阻塞。
2.实现条件的线程通过计算完成条件后调用QWaitConditon::wakeOne()或者QWaitCondition::wakeAll()。
3.当2中调用wake之后,继续执行wait之后的操作。其中wakeOne会随机唤醒等待的线程中的一个。wakeAll会唤醒所有的等待线程。
互斥机制
为了保证先调用wait再调用wake,wait() 在使用时必须传入一个上锁的 QMutex 对象。
task线程先把 mutex 锁占据,一直到 QWaitCondition::wait() 在操作系统层次真正执行阻塞等待指令,这一段主线程的时间段内,mutex 一直被上锁,wake之前,会先调用 mutex.lock() ,因为Task线程已经把mutex占据上锁了,再尝试上锁就会被阻塞,直到Task线程QWaitCondition::wait() 真正执行操作系统的阻塞等待指令并释放mutex,wake线程的 mutex.lock() 才解除阻塞,继续往下执行,调用 wakeAll(),此时唤醒Task线程成功。
例程: