gpt4 book ai didi

C++ 11 - condition_variable - wait_until 未按预期工作

转载 作者:太空狗 更新时间:2023-10-29 21:04:08 30 4
gpt4 key购买 nike

我已经实现了一个示例程序来了解 wait_for 和 wait_until 在 C++11 中的工作原理。

代码-

#include <iostream>
#include <future>
#include <chrono>
#include <mutex>
#include <condition_variable>
#include <thread>

using namespace std;
using namespace std::chrono;

condition_variable cv;
mutex m;
bool flagValue=false;

int sampleFunction(int a)
{
cout<<"Executing sampleFunction...";
cout.flush();
this_thread::sleep_for(seconds(5));
cout<<"Done."<<endl;
return a;
}

void sampleFunctionCond(int a)
{
lock_guard<mutex> lg(m);
cout<<"Executing sampleFunctionCond...";
cout.flush();
this_thread::sleep_for(seconds(5));
cout<<"Done."<<endl;
cout<<"Value : "<<a<<endl;
flagValue=true;
cv.notify_one();
return;
}

int main()
{
unique_lock<mutex> ul(m);
future<int> f1=async(launch::async,sampleFunction,10);
future_status statusF1=f1.wait_for(seconds(1));
if(statusF1==future_status::ready)
cout<<"Future is ready"<<endl;
else if (statusF1==future_status::timeout)
cout<<"Timeout occurred"<<endl;
else if (statusF1==future_status::deferred)
cout<<"Task is deferred"<<endl;
cout<<"Value : "<<f1.get()<<endl;

cv_status statusF2;
thread t1(sampleFunctionCond,20);
t1.detach();
while(!flagValue)
{
statusF2=cv.wait_until(ul,system_clock::now()+seconds(2));
if(statusF2==cv_status::timeout)
{
cout<<"Timeout occurred."<<endl;
break;
}
else
{
cout<<"Condition variable is ready or spurious wake up occurred."<<endl;
}
}
}

输出-

Executing sampleFunction...Timeout occurred
Done.
Value : 10
Executing sampleFunctionCond...Done.
Value : 20
Timeout occurred.

sampleFunction 按预期工作,因为它在“完成”之前打印“发生超时”,但 sampleFunctionCond 的情况并非如此。虽然它知道 wait_until 已超时,但它会在函数 sampleFunctionCOnd 执行完毕后打印消息。

有人可以帮我理解这个吗?谢谢。

最佳答案

statusF2=cv.wait_until(...); 语句中存在竞争条件。可能发生的情况是等待已经超时,即将返回。要返回它需要重新获取互斥锁。同时另一个线程获得了互斥锁。因此,statusF2=cv.wait_until(...); 在另一个线程将 flagValue 设置为 true 并释放互斥锁之前无法返回。

要修复代码,必须在检查等待是否超时之前检查 flagValue 的值。

关于C++ 11 - condition_variable - wait_until 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12192441/

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