作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我还没有全神贯注于 C++11 多线程的东西,但我正在尝试让多个线程等待主线程上的某个事件,然后所有线程立即继续(处理发生的事情),并且wait
当它们完成处理时再次...循环直到它们被关闭。下面不完全是 - 它是我的问题的简单再现:
std::mutex mutex;
std::condition_variable cv;
std::thread thread1([&](){ std::unique_lock<std::mutex> lock(mutex); cv.wait(lock); std::cout << "GO1!\n"; });
std::thread thread2([&](){ std::unique_lock<std::mutex> lock(mutex); cv.wait(lock); std::cout << "GO2!\n"; });
cv.notify_all(); // Something happened - the threads can now process it
thread1.join();
thread2.join();
这行得通……除非我在某些断点处停下来放慢速度。当我这样做时,我看到 Go1!
然后挂起,等待 thread2
的 cv.wait
。怎么了?
也许我无论如何都不应该使用条件变量...wait
周围没有任何条件,也没有需要用互斥锁保护的数据。我应该怎么做?
最佳答案
你走在正确的轨道上......
只需添加一个表示“执行”的 bool 值(受互斥量保护,由条件变量指示):
std::mutex mutex;
std::condition_variable cv;
bool go = false;
std::thread thread1([&](){ std::unique_lock<std::mutex> lock(mutex); while (!go) cv.wait(lock); std::cout << "GO1!\n"; });
std::thread thread2([&](){ std::unique_lock<std::mutex> lock(mutex); while (!go) cv.wait(lock); std::cout << "GO2!\n"; });
{
std::unique_lock<std::mutex> lock(mutex);
go = true;
cv.notify_all(); // Something happened - the threads can now process it
}
thread1.join();
thread2.join();
关于c++ - 使用 condition_variable 控制多线程流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11442886/
我是一名优秀的程序员,十分优秀!