c++条件变量wait_for的行为不符合预期
C++ condition variable wait_for not behaving as expected
我在理解为什么我认为应该通过的测试用例大多数时候都失败了。我已经将测试压缩到条件变量,并使用wait_for方法,专门测试它,看看它是否确实等待至少与指定的持续时间一样长。
测试代码片段如下:
TEST_CASE("Condition variable test")
{
std::mutex m;
std::unique_lock<std::mutex> lock(m);
std::condition_variable cv;
bool ex = false;
std::chrono::milliseconds rel_time(50);
auto start = std::chrono::steady_clock::now();
cv.wait_for(lock, rel_time, [&ex] {return(ex);});
auto end = std::chrono::steady_clock::now();
REQUIRE(std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() >= rel_time.count());
}
根据我对c++ 11标准的理解,我希望这应该一直通过。具有讽刺意味的是,如果我将时钟类型更改为系统时钟,则无法使测试失败。
摘自cplusplus.com的condition_variable::wait_for方法声明:"如果指定了pred(2),该函数仅在pred返回false时阻塞,并且只有当pred变为true时通知才能解除阻塞线程(这对于检查虚假唤醒调用特别有用)。"它的行为就好像实现为:return wait_until (lck, chrono::steady_clock::now() + rel_time, std::move(pred));"
这对我来说意味着使用稳定时钟来获取我的参考时间戳是正确的时钟。
我正在使用MinGW环境与gcc 4.8.2编译器进行编译。
这听起来像是您的供应商实现中的错误。我不明白这个测试怎么会失败。
现在,您的REQUIRE
语句可以大大简化:
REQUIRE(end - start >= rel_time);
durations
之间的比较总是精确。
正如所写的那样,有一种方法可能导致测试失败:如果std::chrono::steady_clock::duration
大于毫秒,则表达式duration_cast<milliseconds>(end - start)
可能导致0ms。为了防止这种糟糕的实现,您可以添加:
static_assert(std::chrono::steady_clock::duration{1} <= std::chrono::milliseconds{1},
"This steady_clock implementation has an outrageously coarse duration");
相关文章:
- 循环仅对第一行正常工作.其他行不受 for 的影响
- C++ 使用递归而不是 for 循环
- 将 QByteArray 转换为无符号短:不符合预期
- 为什么此模板函数的行为不符合预期?
- 为什么 std::basic_ostream::运算符<<不符合 CONST 资格?
- 为什么 C 编译器不在 for 循环体中给出重新声明错误?
- std::vector 构造initializer_list的行为不符合预期
- 计算使用 C++ std 函数而不是 for 循环的大 O
- 集合中不带 for 循环的 n 个连续项的总和
- C++使用 LZ4 进行压缩,压缩信息不符合预期
- 为什么 std::future::wait_for 的行为不符合预期?
- 为什么在这个例子中有"for(auto& x : v)"而不是"for(auto x : &v)"?
- Seekg 的行为不符合预期
- OpenMP 不在 for 循环中的顺序函数的并行化
- Int 附加到字符,行为不符合我的预期
- NDK r16b std::istringstream 的行为不符合预期
- 为什么std::is_copy_constructible的行为不符合预期
- 我的代码到底在哪里不符合键和值类型的规范
- 如果库的包含路径设置不符合预期,如何引发编译错误
- 为什么 [std::is_move_assignable] 的行为不符合预期?