首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >来自`std::chrono::system_clock::now().time_since_epoch()`的时间来自哪里,如果从多个线程访问,它可以阻塞吗?

来自`std::chrono::system_clock::now().time_since_epoch()`的时间来自哪里,如果从多个线程访问,它可以阻塞吗?
EN

Stack Overflow用户
提问于 2017-10-14 02:38:35
回答 2查看 2.5K关注 0票数 4

std::chrono::system_clock::now().time_since_epoch()从哪里来?也就是说,它是与晶体振荡器(物理成分)的直接接口吗?

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

如果所有内核都有一个振荡器,那么如果多个线程完全同时访问它(低延迟环境),它能阻止线程吗?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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++结构复制。

票数 4
EN

Stack Overflow用户

发布于 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_tstd::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中获取值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46740302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档