【发布时间】:2020-06-02 07:18:09
【问题描述】:
最近,我遇到了一个与 C++ 中的条件变量有关的问题。代码如下:
#include <iostream>
#include <thread>
#include <chrono>
#include <mutex>
#include <condition_variable>
std::condition_variable cv;
std::mutex mutex;
int main(){
std::unique_lock<std::mutex> uniqueLock(mutex);
while (true)
{
if(cv.wait_for(uniqueLock, std::chrono::milliseconds(1000)) == std::cv_status::no_timeout)
{
std::cout << "has image" << std::endl;
}
else
{
std::cout<< "time out " << std::endl;
}
}
return 0;
}
这段代码的目标是:每次在另一个线程(cv.notify())中通知条件变量时,在控制台中显示“有图像”,如果超过1000毫秒不能通知,它显示“超时”。
所以上面代码的理论输出是(因为没有通知条件变量):
time out
time out
time out
time out
但是当我在Vs2015中执行这段代码时,发现输出很奇怪:
has image
time out
has image
time out
time out
time out
has image
has image
time out
time out
time out
time out
time out
has image
has image
我想知道为什么我有这个输出以及如何实现我的目标
谢谢!
【问题讨论】:
-
无法重现with gcc,但即使是MSVC 19 似乎也能重现produce the same outcome。大约一年前报告并修复了一个错误,请参阅here。
-
非常感谢 Daniel Langr,我想知道如果不下载链接中的发布版本,是否可以实现与我以另一种方式描述的相同的目标?
标签: c++ timeout condition-variable