首先,我假设调用std :: chrono的任何函数都保证是线程安全的(没有不确定的行为或竞争条件,或者如果从不同的线程调用则不会有任何危险)。我对么?
接下来,例如在Windows上,存在一个与多核处理器有关的众所周知的问题,该问题迫使一些与时间相关的系统实现,从而迫使特定的核获得任何时间信息。
我想知道的是:
是的,some_clock::now()
从不同线程进行的调用应该是线程安全的。
关于你提到的特定问题QueryPerformanceCounter
,仅仅是Windows API在某些平台上暴露了硬件问题。其他操作系统可能会也可能不会将此硬件问题暴露给用户代码。
就C ++标准而言,如果时钟声称是“稳定时钟”,则它绝不能向后退,因此,如果同一线程上有两次读取,则第二个绝不能早于第一个返回值,即使操作系统将线程切换到其他处理器。
对于不稳定时钟(例如std::chrono::system_clock
在许多系统上),由于外部代理可以随时随意更改时钟,因此无法保证。
在我对C ++ 11线程库(包括std::chrono
东西)的实现中,实现要小心确保稳定的时钟确实是稳定的。QueryPerformanceCounter
为了确保同步,这确实要付出超出原始调用的开销,但是不再将线程固定到CPU 0(它曾经这样做)。我希望其他实现也对此问题有解决方法。
稳定时钟的要求在20.11.3 [time.clock.req]中(C ++ 11标准)
我接受这个答案,因为它说steady_clock永远不应该向后退,这正是我最后需要知道的内容。但是,如果您可以添加对标准的引用,那就太好了。另外,我很愚蠢,因为没有先问过你,你在邮件列表中,而我在你的书中间... XD
稳定时钟的要求在20.11.3 [time.clock.req]中
有人知道在用新值重置先前值时(同时从另一个线程读取)std :: chrono :: steady_clock :: time_point是否“合理地预期”与原子变量一样好吗?
不,
time_point
它不是原子变量,因此您无法在不同步的情况下从一个线程读取另一个线程时同时更改一个线程的值不需要获取时钟时间就需要系统调用,因此实际上不会是原子的吗?