在嵌入式平台上,我遇到的问题是,在等待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应如何表现的标准定义?
答案 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::timeout
或std::cv_status::no_timeout
通过这样做,您将能够了解那里发生了什么。
如标准中所述,返回类型遵循以下规则:
cv_status::timeout
如果abs_time
指定的绝对超时已过期,则为cv_status::no_timeout
。
此外:
当通过调用
notify_one()
,调用notify_all()
,abs_time
指定的绝对超时到期或虚假地发出信号时,该功能将取消阻止。
可能最后一个是你的情况,它不太可能是一个错误 你应该寻找那些虚假唤醒的原因。