2017-10-14 731 views
1

std::chrono::system_clock::now().time_since_epoch()从何而来? 也就是说,它是一个与晶体振荡器(物理组件)的直接接口吗?来自`std :: chrono :: system_clock :: now()。time_since_epoch()`的时间是从哪里来的,如果从多个线程访问它可以阻塞?

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

如果所有核心都有一个振荡器,如果多个线程在同一时间(低延迟环境)访问它,它可以阻塞线程吗?

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

+0

您是否有特定的实现? – chris

+0

@chris你能详细说明你的意思吗?你的意思是像x86一样的实现与arm还是代码实现? – Greg

+0

最值得注意的是操作系统,因为计时库可能简单地委托给一个操作系统调用来获取自时代以来的系统时间。例如,Windows具有'GetSystemTime'。这个标准很少会对细节有直接的了解,因为它限制了什么样的系统可以实现它。 – chris

回答

2

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对象,它仅涉及C++结构复制内嵌入duration对象的简单方法观察者。

0

该标准规定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可以将此时钟的时间点转换为time_t或从time_t转换为时间点,暗示时钟表示某种物理时间。其次,时钟被指定为“系统范围”,这意味着所有进程都应该从该时钟检索相同的time_point值。

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

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

什么是更接近你所描述的是std::chrono::steady_clock

23.17.7.2类steady_clock [time.clock.steady]

类steady_clock的对象代表的时钟其time_point值不会减少随着物理时间的增加以及时间点相对于实时的稳定速率的增加。

我们提到了两个要求。首先,时钟必须是单调的,所以时间永远不会“倒退”。其次,时钟是稳定的,所以这个时钟的每个时钟都应该花费相同的物理时间。

用像循环计数器这样的硬件计数器来实现这个时钟感觉很自然。但要小心:这个时钟不一定是系统范围的。这是一个值,例如,从当前正在执行的CPU中获取,即使其他CPU可能具有不同的计数器。

相关问题