gpt4 book ai didi

c++ - C++ 中的条件变量等待

转载 作者:行者123 更新时间:2023-11-28 06:39:07 30 4
gpt4 key购买 nike

我一直在尝试 condition_variable::wait 并且我正在使用:

 template< class Predicate >
void wait( std::unique_lock<std::mutex>& lock, Predicate pred );

但是我执行的时候有点懵。这是一个简单的例子:

 std::condition_variable cv;
std::mutex cv_m;
bool flag = false;

void waits()
{
std::unique_lock<std::mutex> lk(cv_m);
std::cerr << "Waiting... \n";

cv.wait(lk,[]() {return flag == true;});
std::cerr << "...finished waiting " << flag << std::endl;
}

void signals()
{
//std::this_thread::sleep_for(std::chrono::seconds(1));

std::unique_lock<std::mutex> lk(cv_m);
std::cout <<"Counting...."<< std::endl;
flag = true;
for(int i = 0; i < 5; i++) {
std::cout << i << std::endl;
}

cv.notify_all();

}

int main()
{
std::thread t1(waits), t2(waits), t3(waits), t4(signals);
t1.join();
t2.join();
t3.join();
t4.join();

return 0;
}

如果我用

延迟 signals()
  std::this_thread::sleep_for(std::chrono::seconds(1));

它按预期工作,但如果我将上面的行放在注释下,输出就会一团糟。等待条件是否应该暂停 waits() 的执行?为什么我每次都需要延迟输出变化并且大部分时间都搞砸了?

输出示例

 Waiting... 
Counting....
0
1
2
3
4
Waiting...
...finished waiting 1
Waiting...
...finished waiting 1
...finished waiting 1

谢谢你的帮助

最佳答案

您有竞争条件。 t4 有可能在其他线程有机会进入等待之前获取互斥锁并运行完成。因此他们错过了信号。

您需要同步以便 t1t2t3t4 之前进入等待状态开始。每当 sleep 似乎可以解决线程代码中的问题时,您可能遇到了需要真正同步才能正确修复的竞争条件。

关于c++ - C++ 中的条件变量等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26281727/

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