我在理解为什么一个我认为应该传递的测试用例大部分时间都失败的问题。我已经将测试提取到条件变量并使用wait_for方法,特别是对其进行测试以确定它是否确实至少等待指定的持续时间。C++条件变量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标准的理解想到,这应该通过所有的时间。讽刺的是,如果我将时钟类型更改为系统时钟,我无法使测试失败。
对于condition_variable :: wait_for方法,摘自cplusplus.com指出“如果指定pred(2),函数只会在pred返回false时阻止,并且通知只能在线程变为true时解除阻塞(尤其是用于检查虚假的唤醒呼叫),其行为如同实现为: return wait_until(lck,chrono :: steady_clock :: now() + rel_time,std :: move(pred));“
这意味着使用稳定的时钟来取我的参考时间戳是正确的时钟。
我正在编译使用MinGW环境与gcc 4.8.2编译器。
Collin,开始和结束都是time_points。我正在减去时间点来形成一个持续时间。我将测量的持续时间与期望的持续时间进行比较。我的系统上的分辨率对于此测量已足够。我已经将期望的持续时间增加到了500ms和5s,并且测试仍然失败。我仍然很想知道更多关于为什么你认为这是一个糟糕的测试的细节。 –