Warm tip: This article is reproduced from serverfault.com, please click

c++-即使在多核环境中,也有std :: chrono线程安全性保证吗?

(c++ - Is there any std::chrono thread safety guarantee even with multicore context?)

发布于 2012-06-05 09:09:04

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

接下来,例如在Windows上,存在一个与多核处理器有关的众所周知的问题,该问题迫使一些与时间相关的系统实现,从而迫使特定的核获得任何时间信息

我想知道的是:

  1. 在标准中使用std :: chrono,是否可以保证不会出现思考问题?
  2. 还是实现定义了
  3. 还是没有明确的暗示是否意味着你最好在Windows上始终从同一内核获取时间?
Questioner
Klaim
Viewed
11
60.2k 2012-07-05 00:03:49

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