首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果持续时间太长,为什么std::condition_variable::wait_for()返回超时?

如果持续时间太长,为什么std::condition_variable::wait_for()返回超时?
EN

Stack Overflow用户
提问于 2022-02-10 15:56:02
回答 1查看 322关注 0票数 4

在g++ 11.2.1下可以看到以下行为。如果超时变量太大,std::condition_variable wait_for方法将立即返回。特别是在下面的程序中,如果是num_years==1,那么程序按预期挂起(大概要等待一年),但是如果变量num_years==1000则立即返回。

这一切为什么要发生?这是g++中的一个bug吗?还有一个相关的问题,如何让cv.wait_for()无限期地等待,而不是猜测一个大的超时值?

代码语言:javascript
运行
复制
//  This is 'cv_wait.cc' compile with:
//  
//    g++ -o cv_wait -std=c++2a cv_wait.cc
//
// An example showing that wait_for() returns immediately with a timeout
// return value if the duration variable is "too large".
//

#include <iostream>
#include <condition_variable>
#include <chrono>

int main(int argc, char **argv)
{
  std::condition_variable cv;
  std::mutex cv_m;

  // If num_years is "too large", e.g. 1000, then cv.wait_for()
  // returns immediately with a timeout condition!
  int num_years = 1;  // If 1000 then cv.wait_for() returns immediately!
  std::chrono::seconds timeout((uint64_t)3600 * 24 * 365 * num_years);
  std::unique_lock<std::mutex> lock(cv_m);
  if (cv.wait_for(lock, timeout, [] { return false; }))
      std::cerr << "No timeout!\n";
  else
      std::cerr << "Timeout!\n";
}  
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-10 16:08:20

这是condition_variable::wait_for遮罩下的溢出错误。在内部,它正在使用计算steady_clocknanoseconds等待。这个时钟在+/-292年溢出。因此,当1000年被转换为nanoseconds时,它就会溢出。

这看起来像是标准错误,而不是实现错误:http://eel.is/c++draft/thread.condition#condvar-24

实现应该检查这种类型的溢出,如果找到,只需等待它能够等待的最大时间。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71068221

复制
相关文章

相似问题

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