7

我还没有完全理解 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's cv.wait。怎么了?

也许我无论如何都不应该使用条件变量...... 周围没有任何条件wait,也没有需要用互斥锁保护的数据。我应该怎么做?

4

1 回答 1

5

你在正确的轨道上......

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

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();
于 2012-07-11T23:22:29.840 回答