wait_until behavior for time_point::max
wait_until behavior for time_point::max
在一个嵌入式平台上,我遇到了一个问题,当等待一个条件直到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;
}
我很确定这是一个bug,并且在我主机的编译器(g++ 4.7)上运行它,应用程序的行为与我预期的一样(永远阻塞)。在编写bug报告时,我想附加一个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;
将解决此问题。
正如评论中提到的,如果您想尝试跟踪它,您应该检查对wait_until
调用的返回类型。
可以是std::cv_status::timeout
或std::cv_status::no_timeout
。
通过这样做,你将能够理解那里发生了什么。
如标准所述,返回类型遵循以下规则:
此外:如果
abs_time
指定的绝对超时已过期,则为cv_status::timeout
,否则为cv_status::no_timeout
。
当调用
notify_one()
,调用notify_all()
,abs_time
指定的绝对超时过期或虚假时,该函数将解除阻塞。
最后一个可能是你的情况,它不太可能是一个bug。
您应该寻找导致这些虚假唤醒的原因。
相关文章:
- <streamsize>C++ 中 numeric_limits::max() 的值
- 黑客级别的Mini-Max Sum
- 'max'匹配'std::function<const int &(const int &, const int &)>'无过载
- 关于 std::min, std::max 中的比较运算符的混淆
- 找到一种有效的方法,在 2 个巨大的缓冲区上执行 MAX,每字节字节
- std::max() 函数与定点实现的比较中的问题
- 使用 CImg 库的 std::min 和 std::max 的编译问题
- 在 3ds Max 中更新进度条后,环境和效果 UI 不刷新
- 从自定义类获取对象向量中的 max 元素
- 如何在C++中递归地找到max元素的索引?
- SFINAE 与 numeric_limits<T>::max() 在 MSVC2017 上
- 这句话是什么意思 - " vector<long long> distance(n, std::numeric_limits<long long>::max()); "?
- Qt5 部署"procedure entry point could not be located"
- 我想获取点的属性,它报告错误 C3867:"point::output_x":非标准语法;使用"&"创建指向成员的指针
- 如何从内存中分配GDI+ POINT类地址?
- 在f2c.h文件中定义min()max()宏时出错
- c++curl返回413请求实体过大,但是post大小远小于max大小
- 在枚举类型上使用std::max是不是一种糟糕的做法
- 为什么Visual Studio 2019不支持用于减少Openmp的关键字"max"?
- 没有函数模板的实例"max"与参数列表参数类型匹配(int、int)