Windows上的std :: conditional_variable :: wait_for,std :: thread :: sleep_for受调整时钟的影响

Ser*_* Pv 11 c++ winapi c++11 visual-studio-2015 visual-studio-2017

好.我有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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我试过这个:

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

它给了我相同的结果.

BTW:调用的行为一样std::this_thread::sleep_for,std::this_thread::sleep_until都是一样的.

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

Bil*_*eal 14

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

问题是暴露的API合约msvcp140.dll需要一个绝对时间来对抗系统时钟,因此如果系统时钟改变,则有效等待时间会发生变化.该标准允许从稳定时钟中实现非稳定时钟,但不能反过来; 我的前辈显然没有得到那份备忘录:)