gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:37:09 25 4
gpt4 key购买 nike

我还没有全神贯注于 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com