c – 使用condition_variable控制多线程流

前端之家收集整理的这篇文章主要介绍了c – 使用condition_variable控制多线程流前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我还没有完全围绕C 11多线程的东西,但是我试图让多个线程等到主线程上的某个事件然后一次继续(处理发生了什么),并等待它们再次’重新处理…循环直到它们关闭.以下不完全是 – 它是我的问题的简单再现:
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.怎么了?

也许我不应该使用条件变量……等待周围没有任何条件,也没有需要使用互斥锁保护的数据.我该怎么做呢?

解决方法

你走在正确的轨道上……

只需添加一个布尔值(由互斥锁保护,由条件变量指示),表示“go”:

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&C++相关文章