即使有多核上下文,是否有任何std :: chrono线程安全保证?

Kla*_*aim 14 c++ c++-standard-library c++11

首先,我假设调用std :: chrono的任何函数都保证是线程安全的(没有未定义的行为或竞争条件或任何危险的,如果从不同的线程调用).我对么?

接下来,例如在窗口上存在与多核处理器相关的众所周知的问题,其迫使时间相关系统的一些实现允许迫使特定核获得任何时间信息.

我想知道的是:

  1. 在标准中使用std :: chrono,是否有任何保证认为不应出现问题?
  2. 或者它是实现定义的
  3. 或者是否明确缺乏保证意味着在Windows上你最好总是从同一个核心获得时间?

Ant*_*ams 6

是的,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标准)