cof*_*fee 6 c++ qt multithreading
我对自己熟悉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();
}
Run Code Online (Sandbox Code Playgroud)
线程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();
}
Run Code Online (Sandbox Code Playgroud)
使用count变量和扩展互斥同步的原因是为了防止符号丢失.
问题是,我认为符号仍有可能丢失:想象下面的场景:
线程A处理符号,并减少反对(--count); 互斥体被释放; 然后线程A停止
线程B从睡眠状态返回,获取互斥锁,查看该计数== 0,并调用keyPressed.wakeAll(),然后解锁互斥锁.但是,wakeAll()调用无处可去,因为线程A没有等待.
我是对的,还是我错过了什么?如果我是对的,如何纠正这个例子以真正阻止它跳过符号?
rat*_*eak 11
你是对的
为了解决这个问题,应该使用已经获得的互斥锁输入循环:
mutex.lock();
forever {
keyPressed.wait(&mutex);
++count;
mutex.unlock();
do_something();
mutex.lock();
--count;
}
mutex.unlock();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7780 次 |
| 最近记录: |