time_point :: max

时间:2016-09-27 11:24:55

标签: c++ c++11 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应如何表现的标准定义?

2 个答案:

答案 0 :(得分:4)

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

#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

注意:ever_time稳定在过去。

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

答案 1 :(得分:1)

如评论中所述,如果您想尝试追踪,请检查wait_until来电的返回类型。
它可以是std::cv_status::timeoutstd::cv_status::no_timeout 通过这样做,您将能够了解那里发生了什么。

如标准中所述,返回类型遵循以下规则:

  

cv_status::timeout如果abs_time指定的绝对超时已过期,则为cv_status::no_timeout

此外:

  

当通过调用notify_one(),调用notify_all()abs_time指定的绝对超时到期或虚假地发出信号时,该功能将取消阻止。

可能最后一个是你的情况,它不太可能是一个错误 你应该寻找那些虚假唤醒的原因。