繁体   English   中英

std :: chrono :: system_clock :: now()。time_since_epoch()`中的时间从哪里来,如果从多个线程访问,它会阻塞吗?

[英]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_tstd::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM