我用的推荐信以以下方式解释了两者:
wait_for
“阻塞当前线程,直到条件变量被唤醒或在指定的超时时间之后”。wait_until
“阻塞当前线程,直到条件变量被唤醒或到达指定的时间点”。有什么关系?wait_until
是否会在发出信号时使线程完全(或多或少)继续运行,而wait_for
只是在此时将线程添加回调度中?
发布于 2017-09-23 18:32:35
正如安东尼·威廉姆斯的“书”中所解释的,它们在用法上有一个重要的区别
考虑下面的示例,其中一个条件变量等待超时:
std::condition_variable cv;
bool done;
std::mutex m;
bool wait_loop()
{
auto const timeout= std::chrono::steady_clock::now()+
std::chrono::milliseconds(500);
std::unique_lock<std::mutex> lk(m);
while(!done)
{
if(cv.wait_until(lk,timeout)==std::cv_status::timeout)
break;
}
return done;
}
如果您没有将谓词传递给wait,那么这是一种建议的方法,用于等待具有时间限制的条件变量。这样,循环的总长度是有界。正如您在第4.1.1节中看到的,如果不传递谓词,则在使用条件变量时需要循环,以便处理虚假的唤醒。如果在循环中使用
wait_for()
,则可能会在虚假的唤醒之前等待几乎一段时间,下一次通过等待时间的过程再次开始。这可能重复任何次数,使总等待时间无界。
国际海事组织,这是一个这样的场景,wait_for
不能如此容易地取代wait_until
,因为它的重置性质。
https://stackoverflow.com/questions/13142255
复制相似问题