我正在熟悉 QT5 并发库。我正在查看 QWaitCondition 示例(http://qt-project.org/doc/qt-5.0/qtcore/qwaitcondition.html#details)。
在这里,一个线程(线程 B)读取用户输入,所有其他线程(线程 A)处理此输入。
线程 A:
forever {
mutex.lock();
keyPressed.wait(&mutex);
++count;
mutex.unlock();
do_something();
mutex.lock();
--count;
mutex.unlock();
}
线程 B:
forever {
getchar();
mutex.lock();
// Sleep until there are no busy worker threads
while (count > 0) {
mutex.unlock();
sleep(1);
mutex.lock();
}
keyPressed.wakeAll();
mutex.unlock();
}
使用计数变量和广泛的互斥同步的原因是为了防止符号丢失。
问题是,我认为符号仍有可能丢失:想象以下场景:
线程 A 处理一个符号,并减少计数(--count);互斥体被释放;然后线程 A 停止
线程 B 从睡眠中返回,获取互斥锁,看到 count == 0,并调用 keyPressed.wakeAll(),然后解锁互斥锁。然而,wakeAll() 调用无处可去,因为线程 A 没有等待。
- 线程 A 再次启动,获取互斥体并进入 wait()。因为已经调用了 wakeAll(),所以符号丢失了。
我是对的,还是我错过了什么?如果我是对的,如何更正示例以真正防止它跳过符号?