好。我有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_for
,std::this_thread::sleep_until
等来电的行为是一样的。
所以问题是:是否可以将std::condition_variable
用于预期的行为?或者我只需要用我自己的CONDITION_VARIABLE包装器替换它?
答案 0 :(得分:13)
这是VS2015的msvcp140.dll
的一个已知错误,不幸的是它正在修复ABI。我在下一个主要版本中修复了它(我从头开始完全重写了条件变量实现),但我不知道接下来会发生什么。请注意,就标准库而言,VS2017是次要版本。
问题是<ContentControl>
<ContentControl.Content>
<x:Object/>
</ContentControl.Content>
</ContentControl>
公开的API契约需要一个绝对时间来反对系统时钟,因此如果系统时钟发生变化,则有效等待时间会发生变化。该标准允许从稳定时钟中实现非稳定时钟,但不能反过来;我的前辈显然没有得到那份备忘录:)