Qt5 QWaitCondition example
Qt5 QWaitCondition example
我正在熟悉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 从睡眠状态返回,获取互斥锁,看到计数 == 0,并调用 keyPressed.wakeAll(),然后解锁互斥锁。 但是,wakeAll() 调用无处可去,因为线程 A 是 不等。
- 线程 A 再次启动,将互斥锁变为 wait()。 由于 wakeAll() 已经被调用,符号丢失了。
我是对的,还是我错过了什么?如果我是对的,如何纠正示例以真正防止它跳过符号?
你是对的
要解决此问题,应在已获取互斥锁的情况下进入循环:
mutex.lock();
forever {
keyPressed.wait(&mutex);
++count;
mutex.unlock();
do_something();
mutex.lock();
--count;
}
mutex.unlock();
相关文章:
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- Qt focusObjectChanged example?
- 运行命令 "rosbag play example.bag" 时出错。找不到与插件 rosbag/NoEncryptor 对应的库
- QWebSocket Hello World Example
- c++ Doxygen example and description
- Example of CDocument::ReleaseFile for MFC
- 找不到 int com.example.nimashahbazi.mooshak.EncryptingActivity.
- Qt example const_cast
- TensorFlow C++ example for Android
- 运行"OpenPose C++ API Tutorial - Example 3 - Body from image"失败
- _Unwind_RaiseException example
- std::none_of example from cppreference.com
- Microsoft AMP for C++ with Dr Dobbs example?
- 在macOSX上编译boost_asio/example/ssl/server.cpp可以在Linux上工作
- Example for LVM_SUBITEMHITTEST
- Example of C++ 11 std::chrono::duration
- 重写 contiki 源代码“example-mesh.c”以根据计时器值发送消息
- boost::algorithm::boyer_moore_search OO example
- FSEvents C++ Example
- example of embarcadero WindowHandleToPlatform c++