在嵌入式平台上,我遇到了一个问题,即等待一个条件直到 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 也遇到了一个繁忙的循环:
现在我不确定谁是正确的。当第二个参数为 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/