gpt4 book ai didi

C++ 条件变量 wait_for 未按预期运行

转载 作者:搜寻专家 更新时间:2023-10-31 01:39:49 27 4
gpt4 key购买 nike

我无法理解为什么我认为应该通过的测试用例大部分时间都失败了。我已将测试提炼为条件变量并使用 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 时才阻塞,并且通知只能在它变为 true 时解除线程阻塞(这对于检查虚假唤醒特别有用调用)。它的行为就像实现为:return wait_until (lck, chrono::steady_clock::now() + rel_time, std::move(pred));"

这对我来说意味着使用稳定时钟获取我的引用时间戳是正确的时钟。

我正在使用带有 gcc 4.8.2 编译器的 MinGW 环境进行编译。

最佳答案

这听起来像是供应商实现中的错误。我不明白这个测试怎么会失败。

Fwiw,你的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");

关于C++ 条件变量 wait_for 未按预期运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30627773/

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