gpt4 book ai didi

c++ - Windows 上的 std::conditional_variable::wait_for、std::thread::sleep_for 受调整时钟的影响

转载 作者:可可西里 更新时间:2023-11-01 15:09:55 26 4
gpt4 key购买 nike

嗯。我有 Win10 x64 和这个非常简单的代码:

int main() {
std::conditional_variable cv;
std::mutex m;
std::unique_lock<std::mutex> lock(m);
while(1) {
cv.wait_for(lock, 1000ms, [](){return false;});
std::cout << "!" << std::endl;
}
}

是的。代码就像我期望的那样工作;表明 '!'每一秒。但是,如果我更改本地时间(例如减去 1 小时/分钟),它会永远有效。如果我用 WinAPI Sleep(1000) 替换 cv.wait_for(...) 它工作正常。 WinAPI SleepConditionVariableCS 也能正常工作。

我试过这个:

cv.wait_until(lock, std::chrono::steady_clock::now() + 1000ms, [](){return false;});

它给了我同样的结果。

顺便说一句:std::this_thread::sleep_forstd::this_thread::sleep_until 等调用的行为是相同的。

所以问题是:是否可以使用具有预期行为的 std::condition_variable?或者我只需要用我自己的 CONDITION_VARIABLE 包装器替换它?

最佳答案

这是 VS2015 的 condition_variable 的一个已知错误,不幸的是它会破坏 ABI 以修复。我在下一个主要版本中修复了它(我从头开始完全重写了条件变量实现),但我不知道接下来什么时候会发生。请注意,就标准库而言,VS2017 是次要版本。

问题是 msvcp140.dll 公开的 API 合约需要相对于系统时钟的绝对时间,因此如果系统时钟发生变化,有效等待长度也会发生变化。该标准允许从稳定时钟中实现不稳定时钟,但不能反过来;我的前任显然没有收到那份备忘录 :)

关于c++ - Windows 上的 std::conditional_variable::wait_for、std::thread::sleep_for 受调整时钟的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47349751/

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