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

标签 c++ c++11 c++-standard-library

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

接下来,例如 on windows there is a well known problem related to multi-core processors那力量some implementations of time related systems to allow forcing a specific core to get any time information .

我想知道的是:

  1. 在标准中使用std::chrono,是否有任何保证不会出现think样的问题?
  2. 或者是实现定义的
  3. 或者是否有明确的缺乏保证意味着在 Windows 上您最好始终从同一个内核获取时间?

最佳答案

是的,从不同线程调用 some_clock::now() 应该是线程安全的。

至于您提到的 QueryPerformanceCounter 的具体问题,只是 Windows API 在某些平台上暴露了硬件问题。其他操作系统可能会也可能不会将此硬件问题暴露给用户代码。

就 C++ 标准而言,如果时钟声称是“稳定时钟”,那么它决不能倒退,所以如果在同一个线程上有两次读取,第二次的返回值决不能早于第一个,即使操作系统将线程切换到不同的处理器。

对于非稳定时钟(例如许多系统上的 std::chrono::system_clock),对此没有任何保证,因为无论如何外部代理都可以任意更改时钟。

my implementation of the C++11 thread library (包括 std::chrono 东西)实现注意确保稳定的时钟确实是稳定的。这确实比对 QueryPerformanceCounter 的原始调用强加了成本以确保同步,但不再将线程固定到 CPU 0(它曾经这样做)。我希望其他实现也有解决此问题的方法。

稳定时钟的要求在 20.11.3 [time.clock.req](C++11 标准)中

关于c++ - 即使使用多核上下文,是否有任何 std::chrono 线程安全保证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10894504/

相关文章:

C++shared_ptr绑定(bind)映射转换段错误

c++ - 从字符指针获取迭代器 (C++)

c++ - 为什么C++标准库中没有transform_if?

c++ - 修复 C++ 中奇怪的写入文件错误

c++ - 地址 sanitizer 在静态转换无效指针时报告错误

c++ - 引用静态函数局部变量

c++ - 满足中断条件后继续循环

c++ - std::exception:使用虚函数和继承与变量

函数参数的 C++ 类模板推导 (P0091R0)

C++:使用 “().” 和 “()[].”