首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >std::condition_variable::wait_for和std::condition_variable::wait_until有什么区别?

std::condition_variable::wait_for和std::condition_variable::wait_until有什么区别?
EN

Stack Overflow用户
提问于 2012-10-30 15:25:00
回答 3查看 12.4K关注 0票数 38

我用的推荐信以以下方式解释了两者:

  • wait_for“阻塞当前线程,直到条件变量被唤醒或在指定的超时时间之后”。
  • wait_until“阻塞当前线程,直到条件变量被唤醒或到达指定的时间点”。

有什么关系?wait_until是否会在发出信号时使线程完全(或多或少)继续运行,而wait_for只是在此时将线程添加回调度中?

EN

Stack Overflow用户

发布于 2017-09-23 18:32:35

正如安东尼·威廉姆斯的“”中所解释的,它们在用法上有一个重要的区别

考虑下面的示例,其中一个条件变量等待超时:

代码语言:javascript
运行
复制
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,因为它的重置性质。

票数 3
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13142255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档