64,637
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <chrono>
#include <condition_variable>
#include <mutex>
#include <future>
using namespace std;
condition_variable cvTimer;
mutex cvMutex;
future<void> ftReturn;
void WorkThread()
{
unique_lock<mutex> lk(cvMutex);
while (true)
{
auto r = cvTimer.wait_for(lk, chrono::milliseconds(500));
if (cv_status::timeout == r)
{
//这是正常的时间到了,做一些必要的事情
cout << "Do Work" << endl;
}
else
{
//这是退出了,
//但是在我还没有调用StopWork就很有可能会进到这里来
//看文档好像有虚假唤醒这么一说,
//但是唤醒的代码只有一处,而且还未调用,怎么就唤醒了?
cout << "Stop Work" << endl;
return;
}
}
}
void StartWork()
{
ftReturn = async(launch::async, &WorkThread);
}
void StopWork()
{
unique_lock<mutex> lk(cvMutex);
cvTimer.notify_one();
lk.unlock();
ftReturn.wait();
}
int main()
{
StartWork();
this_thread::sleep_for(chrono::seconds(60));
StopWork();
}
条件变量,都是要带flag用while来判断flag的,避免虚假退出。