gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:36:09 24 4
gpt4 key购买 nike

在嵌入式平台上,我遇到了一个问题,即等待一个条件直到 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com