c++ - time_point::max 的 wait_until 行为

标签 c++ c++11 c++-chrono

在嵌入式平台上,我遇到了一个问题,即等待一个条件直到 time_point<clock>::max() , 程序进入忙循环完全使用CPU。

我正在运行的程序是:

#include <mutex>
#include <condition_variable>
#include <iostream>

int main() {
  std::mutex mutex;
  std::condition_variable condition;

  using namespace std::chrono;
  using clock = steady_clock;
  for (;;) {
    auto forever = time_point<clock>::max();
    std::unique_lock<std::mutex> lock(mutex);

    std::cout << "Now waiting" << std::endl;
    condition.wait_until(lock, forever);
    std::cout << "Now waking up" << std::endl;
  }

  return 0;
}

我非常确定这是一个错误,并且在我主机的编译器 (g++ 4.7) 上运行它,应用程序的行为符合我的预期(永远阻塞)。在编写错误报告时,我想附上一个演示该问题的 ideone 示例,但 ideone 也遇到了一个繁忙的循环:

http://ideone.com/XPy0Wn

现在我不确定谁是正确的。当第二个参数为 time_point<clock>::max() 时,是否有标准定义条件下的 wait_until 应该如何表现? ?

最佳答案

您可能会观察到稳定时钟到系统时钟时间的(愚蠢的)转换:

#include <chrono>
#include <iostream>

using namespace std::chrono;

time_t silly_steady_clock_to_time_t( steady_clock::time_point t )
{
    return system_clock::to_time_t(system_clock::now()
         + (t - steady_clock::now()));
}

int main() {
      auto system_time = system_clock::to_time_t(system_clock::now());
      auto forever = time_point<steady_clock>::max();
      auto forever_time = silly_steady_clock_to_time_t(forever);
      std::cout << ctime(&forever_time) << '\n';
      std::cout << ctime(&system_time) << '\n';
      return 0;
}

输出:

Fri Jun 16 11:40:31 1724
Tue Sep 27 15:44:54 2016

注意:稳定的forever_time是过去的。

clock 更改为 using clock = system_clock; 将解决此问题。

关于c++ - time_point::max 的 wait_until 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39723413/

相关文章:

模板和非模板函数之间的 C++ 重载解析

c++ - 为什么会出现此错误? "unresolved external symbol"

c++ - 什么时候实例化模板类的特殊成员函数?

c++ - 如何在最后一个节点中使奇数偶数LinkedList因子?

c++ - constexpr char[] 作为类成员有什么好处?

c++ - 删除此架构和未定义的行为

c++ - VS2013 中的高分辨率时钟

c++ - 将 chrono::milliseconds 转换为 uint64_t?

c++ - std::chrono::duration_cast 1 秒和 2 秒的奇怪结果

C++ 二叉搜索树 - 复杂类型