c++ - 使用 condition_variable 控制多线程流

标签 c++ multithreading c++11 condition-variable

我还没有全神贯注于 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! 然后挂起,等待 thread2cv.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/

相关文章:

java - 为什么像获取和添加这样的原子操作会返回被更改变量的旧值?

android - OpenCV无法为ARM64目标构建(Android)

c++ - 根据 C++11 标准中的 §12.1/4,代码不应编译

c++ - 使用默认参数重载构造函数

Python 模拟 C++ 指向类成员的指针

c++ - BOOST_FOREACH 和 cxxtest 插件的转换问题

java - 做同步的java方法队列调用?

c# - 如何对多线程场景中只执行一次的代码进行单元测试?

c++ - 减少几乎重复的模板实例化

c++ - 函数返回一个由 vector ​​组成的元组