std::chrono::system_clock::now().time_since_epoch()
从哪里来?也就是说,它是与晶体振荡器(物理成分)的直接接口吗?
如果它是一个晶体振荡器,是每个核心一个还是所有核心一个?
如果所有内核都有一个振荡器,那么如果多个线程完全同时访问它(低延迟环境),它能阻止线程吗?
如果每个核心都有一个晶体振荡器,它们是如何同步的?
发布于 2017-10-14 04:19:02
C++标准并不关心如何实现system_clock::now()
。它只是指定
返回表示当前时间点的
time_point
对象。
典型的C++标准库实现将依赖底层OS系统调用来获取实际的系统时钟值来构造time_point
对象。
在硬件实现方面,您需要考虑硬件架构。但通常,无论读取多少进程/线程,系统时钟的维护成本总是存在的。系统时钟获取作为一个轻量级的例程来实现,不会导致线程阻塞,不会成为多线程程序的性能瓶颈。
此外,std::chrono::system_clock::now().time_since_epoch()
是一种简单的观测器方法,它只返回std::chrono::system_clock::now()
返回的time_point
对象中嵌入的duration
对象,只包含C++结构复制。
发布于 2017-10-14 05:40:30
该标准将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::from_time_t
时间转换,这意味着时钟代表了某种物理时间。其次,时钟被指定为“系统范围的”,这意味着所有进程都应该从这个时钟中检索相同的time_point
值。
实际上,这意味着这个时钟通常是通过调用OS特定的函数来实现的,这些函数可以检索某种时间,例如在任务栏中可以看到。
注意,如果此时钟为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中获取值。
https://stackoverflow.com/questions/46740302
复制相似问题