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

时间:2017-11-17 11:35:59

标签: c++ c++11 winapi 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;
    }
}

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

我试过这个:

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

它给了我相同的结果。

BTW:std::this_thread::sleep_forstd::this_thread::sleep_until等来电的行为是一样的。

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

1 个答案:

答案 0 :(得分:13)

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

问题是<ContentControl> <ContentControl.Content> <x:Object/> </ContentControl.Content> </ContentControl> 公开的API契约需要一个绝对时间来反对系统时钟,因此如果系统时钟发生变化,则有效等待时间会发生变化。该标准允许从稳定时钟中实现非稳定时钟,但不能反过来;我的前辈显然没有得到那份备忘录:)