"std::chrono::system_clock::now().time_since_epoch()&qu

Where does the time from `std::chrono::system_clock::now().time_since_epoch()` come from and can it block if accessed from multiple threads?

本文关键字:time since qu epoch clock quot std chrono system now      更新时间:2023-10-16

std::chrono::system_clock::now().time_since_epoch()从何而来? 也就是说,它是与晶体振荡器(物理组件)的直接接口吗?

如果是晶体振荡器,是每个内核一个还是所有内核一个?

如果所有内核都有一个振荡器,如果多个线程同时访问它(低延迟环境),它是否会阻塞线程?

如果每个内核都有一个晶体振荡器,它们是如何同步的?

C++ Standard 并不关心system_clock::now()是如何实现的。它只是指定

返回表示当前时间点的time_point对象。

典型的C++标准库实现将依赖于基础操作系统系统调用来获取实际的系统时钟值来构造time_point对象。

在硬件实现方面,您需要考虑硬件架构。但通常系统时钟的维护成本始终存在,无论有多少进程/线程正在读取它。系统时钟获取是作为轻量级例程实现的,它不会导致线程阻塞,也不会成为多线程程序中的性能瓶颈。

此外,std::chrono::system_clock::now().time_since_epoch()是一个简单的观察器方法,它只返回std::chrono::system_clock::now()返回的time_point对象内的嵌入duration对象,这只涉及C++结构复制。

该标准规定std::chrono::system_clock如下:

23.17.7.1 类system_clock [时间-时钟.系统]

类 system_clock 的对象表示系统范围的实时时钟中的挂钟时间。

这具有多重含义。首先,这个时钟的时间点可以通过std::chrono::system_clock::to_time_tstd::chrono::system_clock::from_time_t和来转换为time_t时间,暗示时钟代表某种物理时间。其次,时钟被指定为"系统范围",这意味着所有进程都应从该时钟中检索相同的time_point值。

实际上,这意味着此时钟最常通过调用检索某种时间的操作系统特定函数来实现,例如,您在任务栏中看到的那样。

请注意,如果此时钟is_steady,则未指定。这意味着这个时钟的timepoints不必总是前进。即使呼叫发生在物理时间的较晚,您也可以获得较早的时间点。例如,如果用户通过某些操作系统设置调整时钟,则可能会发生这种情况。

更接近您所描述的内容是std::chrono::steady_clock

23.17.7.2 类steady_clock [时间.时钟.稳定]

类 steady_clock 的对象表示时钟,其 time_point 值永远不会随着物理时间的推进而减少,并且time_point的值相对于实时以稳定的速率前进。

我们提到了两个要求。首先,时钟必须是单调的,所以时间永远不能"倒流"。其次,时钟是稳定的,因此该时钟的每次滴答声都应该花费相同的物理时间。

使用某种硬件计数器(如周期计数器)实现此时钟感觉很自然。但要小心:这个时钟不必是系统范围的。例如,这样就可以从当前正在执行的 CPU 中获取值,即使可能存在具有不同计数器的其他 CPU。