【发布时间】:2019-09-18 09:34:16
【问题描述】:
在一个单独的主线程中执行相同的代码,条件变量的行为不同
#include <iostream>
#include <condition_variable>
#include <mutex>
#include <chrono>
#include <thread>
using namespace std;
using namespace std::chrono;
using namespace std::chrono_literals;
void waits()
{
std::mutex mCvMtx;
std::condition_variable mCondVar;
auto now = std::chrono::system_clock::now();
std::unique_lock<std::mutex> lk(mCvMtx);
if(mCondVar.wait_until(lk, now+ 3*1000ms) == cv_status::timeout)
{
cout << "Fire";
}
else
{
cout << "Condition variable notified ";
}
now = std::chrono::system_clock::now();
}
int main()
{
std::thread t1(waits);
t1.join();
return 0;
}
#include <iostream>
#include <condition_variable>
#include <mutex>
#include <chrono>
#include <thread>
using namespace std;
using namespace std::chrono;
using namespace std::chrono_literals;
int main()
{
std::mutex mCvMtx;
std::condition_variable mCondVar;
auto now = std::chrono::system_clock::now();
std::unique_lock<std::mutex> lk(mCvMtx);
if(mCondVar.wait_until(lk, now+ 3*1000ms) == cv_status::timeout)
{
cout << "Fire";
}
else
{
cout << "Condition variable notified ";
}
now = std::chrono::system_clock::now();
return 0;
}
我不明白为什么在第一个示例中输出结果为“Fire”(因此未通知 cv 并等待我指定的时间),而在第二个示例中,我在主线程中执行相同的代码,输出结果“通知条件变量”,无需等待任何秒。
你有什么解释吗?谢谢
【问题讨论】:
-
不相关,但不要使用
system_clock来测量时间,更喜欢steady_clock代替(系统时钟可以调整,例如通过ntp更新)。跨度>
标签: c++ multithreading c++11 condition-variable