16

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

接下来,例如在 Windows 上,有一个众所周知的与多核处理器相关的问题,它强制时间相关系统的某些实现允许强制特定内核获取任何时间信息

我想知道的是:

  1. 在标准中使用 std::chrono 是否可以保证不会出现这样的问题?
  2. 还是实现定义
  3. 或者是否有明确的缺乏保证意味着在 Windows 上你最好总是从同一个核心获得时间?
4

2 回答 2

7

是的,来自不同线程的调用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 标准)

于 2012-07-04T14:01:43.790 回答
-2

老实说,我相信下面的陈述完全回答了这个问题:不能保证实现不会有特定于平台的错误。这一切都应该完美地工作,但有时出于某种原因,它没有。没有人可以向你保证它会做你想做的事,但它应该可以工作。

于 2012-06-06T08:58:13.887 回答