![](/img/trans.png)
[英]Does the value of std::chrono::system_clock.now().time_since_epoch().count() increase monotonically?
[英]Where does the time from `std::chrono::system_clock::now().time_since_epoch()` come from and can it block if accessed from multiple threads?
std::chrono::system_clock::now().time_since_epoch()
来自std::chrono::system_clock::now().time_since_epoch()
? 也就是说,它是与晶体振荡器(物理组件)的直接接口吗?
如果是晶体振荡器,则每个内核有一个或所有内核都有一个?
如果所有内核都有一个振荡器,如果多个线程恰好同时访问它(低延迟环境),它可以阻塞线程吗?
如果每个内核都有一个晶体振荡器,它们如何同步?
C ++ Standard并不关心system_clock::now()
的实现方式。 它只是指定
返回代表当前时间点的
time_point
对象。
典型的C ++标准库实现将依赖于底层OS系统调用来获取实际的系统时钟值以构造time_point
对象。
在硬件实现方面,您将需要考虑硬件体系结构。 但是通常,无论有多少个进程/线程正在读取它,系统时钟的维护成本始终存在。 而且,系统时钟获取是作为轻量级例程实现的,该例程不会导致线程阻塞,也不会成为多线程程序中的性能瓶颈。
此外, std::chrono::system_clock::now().time_since_epoch()
是一个简单的观察者方法,它仅返回std::chrono::system_clock::now()
time_point
std::chrono::system_clock::now()
返回的time_point
对象内的嵌入时duration
对象。仅涉及C ++结构复制。
该标准指定std::chrono::system_clock
如下:
23.17.7.1类system_clock [time.clock.system]
类system_clock的对象表示系统范围实时时钟的挂钟时间。
这具有多重含义。 首先,可以通过std::chrono::system_clock::to_time_t
和std::chrono::system_clock::from_time_t
std::chrono::system_clock::to_time_t
将此时钟的时间点与time_t
时间进行相互转换, std::chrono::system_clock::from_time_t
暗示该时钟代表某种物理时间。 其次,时钟被指定为“系统范围”,这意味着所有进程都应从该时钟检索相同的time_point
值。
实际上,这意味着该时钟通常是通过调用特定于操作系统的函数来实现的,该函数检索某种时间,例如您在任务栏中看到的那样。
注意,未指定此时钟是否为is_steady
。 这意味着该时钟的timepoints
不必总是提前。 即使呼叫发生在物理时间较晚,您也可以得到较早的时间点。 例如,如果用户通过某些OS设置调整了时钟,则可能会发生这种情况。
更接近您所描述的是std::chrono::steady_clock
:
23.17.7.2类steady_clock [time.clock.steady]
steady_clock类的对象表示以下时钟:对于它们的时钟,time_point的值从不随物理时间的增长而减小,并且针对它们的time_point的值相对于实时以稳定的速率增长。
我们提到了两个要求。 首先,时钟必须是单调的,因此时间永远不能“倒退”。 其次,时钟稳定,因此此时钟的每个滴答声都应占用相同的物理时间。
用某种硬件计数器(如周期计数器)来实现此时钟是很自然的。 但请注意:此时钟不必是系统范围的。 这样的话,即使可能存在其他具有不同计数器的CPU,也可以从当前正在执行的CPU中获取值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.