Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 忽略虚假唤醒,条件变量::等待_C++_C++11_Condition Variable - Fatal编程技术网

C++ 忽略虚假唤醒,条件变量::等待

C++ 忽略虚假唤醒,条件变量::等待,c++,c++11,condition-variable,C++,C++11,Condition Variable,文档说明,谓词的第二个重载可用于避免虚假唤醒。我没有看到它,如何修改代码以确保wait_for不会被错误唤醒 while(count_ > 0) { if (condition_.wait_for(lock, std::chrono::milliseconds(timeOut_)) == std::cv_status::timeout) break; } 该文档具有误导性:可能存在spurios唤醒,但是带有谓词的wait_for()仅在谓

文档说明,谓词的第二个重载可用于避免虚假唤醒。我没有看到它,如何修改代码以确保wait_for不会被错误唤醒

while(count_ > 0) {
    if (condition_.wait_for(lock, std::chrono::milliseconds(timeOut_)) ==
            std::cv_status::timeout)
        break;
}

该文档具有误导性:可能存在spurios唤醒,但是带有谓词的
wait_for()
仅在谓词us
true
时才会返回。也就是说,当使用谓词版本时,似乎没有虚假的唤醒。您可以通过记录谓词执行的频率来检测是否存在虚假唤醒

你会像这样使用它

if (condition_.wait_for(lock,
                        std::chrono::milliseconds(timeOut_),
                        [&](){ return count_ <= 0; }) ==
        std::cv_status::timeout) {
    // deal with timeout here
}
if(条件)等待(锁定、,
std::chrono::毫秒(超时),

[&](){return count_uuu将lambda作为谓词,如中所示。不过,在使用超时时,区别是很重要的,这取决于您对超时的要求,您必须重新计算超时,以防发生错误唤醒-这(可能)是等待()不暴露虚假唤醒的重载对您有帮助。@不,我不认为它实际上会重新计算超时,看看wait_,直到文档,它看起来只是重新启动计时器。@SteveM:根据30.5.1[thread.condition.condvar]paragragh 38调用
wait_for()
相当于调用
wait_until()
,计算的时间为
chrono::staid_clock::now()+rel_time
。因此,它不会重新计算相对时间,但也不会在相同的超时情况下重新启动。