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需要一个绝对时间来对抗系统时钟,因此如果系统时钟改变,则有效等待时间会发生变化.该标准允许从稳定时钟中实现非稳定时钟,但不能反过来; 我的前辈显然没有得到那份备忘录:)
| 归档时间: |
|
| 查看次数: |
1274 次 |
| 最近记录: |