C++11-condition_variable-wait_until未按预期工作
C++ 11 - condition_variable - wait_until not working as expected
我已经实现了一个示例程序来了解wait_fo和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(...);
语句中存在竞争条件。可能发生的情况是等待已经超时,并且即将返回。要返回,它需要重新获取互斥对象。与此同时,另一个线程已经获取了互斥对象。因此,在其他线程将flagValue
设置为true并释放互斥之前,statusF2=cv.wait_until(...);
不能返回。
要修复代码,在检查等待是否超时之前,必须检查flagValue
的值。
函数"sampleFunctionCond"不应该一直持有互斥对象"m"。您可以尝试在"flagValue=true;"行之前立即锁定"m"。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- std::condition_variable::wait()如何评估给定的谓词
- C++ Singleton - Prevent ::instance() to variable
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- std::memory_order for std::atomic:<T>:wait
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃