Kla*_*aim 14 c++ c++-standard-library c++11
首先,我假设调用std :: chrono的任何函数都保证是线程安全的(没有未定义的行为或竞争条件或任何危险的,如果从不同的线程调用).我对么?
接下来,例如在窗口上存在与多核处理器相关的众所周知的问题,其迫使时间相关系统的一些实现允许迫使特定核获得任何时间信息.
我想知道的是:
是的,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标准)