"std::chrono::system_clock::now().time_since_epoch()&qu
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()
从何而来? 也就是说,它是与晶体振荡器(物理组件)的直接接口吗?
如果是晶体振荡器,是每个内核一个还是所有内核一个?
如果所有内核都有一个振荡器,如果多个线程同时访问它(低延迟环境),它是否会阻塞线程?
如果每个内核都有一个晶体振荡器,它们是如何同步的?
C++ Standard 并不关心system_clock::now()
是如何实现的。它只是指定
返回表示当前时间点的
time_point
对象。
典型的C++标准库实现将依赖于基础操作系统系统调用来获取实际的系统时钟值来构造time_point
对象。
在硬件实现方面,您需要考虑硬件架构。但通常系统时钟的维护成本始终存在,无论有多少进程/线程正在读取它。系统时钟获取是作为轻量级例程实现的,它不会导致线程阻塞,也不会成为多线程程序中的性能瓶颈。
此外,std::chrono::system_clock::now().time_since_epoch()
是一个简单的观察器方法,它只返回std::chrono::system_clock::now()
返回的time_point
对象内的嵌入duration
对象,这只涉及C++结构复制。
该标准规定std::chrono::system_clock
如下:
23.17.7.1 类system_clock [时间-时钟.系统]
类 system_clock 的对象表示系统范围的实时时钟中的挂钟时间。
这具有多重含义。首先,这个时钟的时间点可以通过std::chrono::system_clock::to_time_t
和std::chrono::system_clock::from_time_t
和来转换为time_t
时间,暗示时钟代表某种物理时间。其次,时钟被指定为"系统范围",这意味着所有进程都应从该时钟中检索相同的time_point
值。
实际上,这意味着此时钟最常通过调用检索某种时间的操作系统特定函数来实现,例如,您在任务栏中看到的那样。
请注意,如果此时钟is_steady
,则未指定。这意味着这个时钟的timepoints
不必总是前进。即使呼叫发生在物理时间的较晚,您也可以获得较早的时间点。例如,如果用户通过某些操作系统设置调整时钟,则可能会发生这种情况。
更接近您所描述的内容是std::chrono::steady_clock
:
23.17.7.2 类steady_clock [时间.时钟.稳定]
类 steady_clock 的对象表示时钟,其 time_point 值永远不会随着物理时间的推进而减少,并且time_point的值相对于实时以稳定的速率前进。
我们提到了两个要求。首先,时钟必须是单调的,所以时间永远不能"倒流"。其次,时钟是稳定的,因此该时钟的每次滴答声都应该花费相同的物理时间。
使用某种硬件计数器(如周期计数器)实现此时钟感觉很自然。但要小心:这个时钟不必是系统范围的。例如,这样就可以从当前正在执行的 CPU 中获取值,即使可能存在具有不同计数器的其他 CPU。
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 为什么我会收到"Run-Time Check Failure #2 - Stack around the variable 'pr' was corrupted"错误?
- 解析某些行的文本和输出"time of appearance"
- 返回time()库函数的数据类型
- 如何将 time-uuid(存储在 boost uuid 中)转换为时间戳/自纪元以来的时间?
- 如何从 boost::p osix_time::p time 获取秒数
- 调用 dll 函数时"Run-Time Check Failure #0 - The value of ESP"
- C++ SRAND(time(0)) 在猜谜游戏中不起作用
- 即使包含 <time.h 后仍"‘CLOCK_PER_SEC’ was not declared in this scope"错误>
- struct TM time;vs TM time = {}.输出相同但不相同?
- 使用 Windows 寄存器查找下一个"Daylight Saving Time"
- c++ get millsecond time
- "Feature X requires run-time support"的含义是什么?
- 如何传递以 "size determined at run time" 作为引用的动态分配数组?
- constexpr - "Evaluate value at compile time"到底是什么意思?
- "Time"库形式 Arduino 显示不正确的值
- 自定义 Python 构建 - time.so:未定义的符号:PyExc_ValueError
- 如何使"days-since-epoch"值与 std::chrono 配合使用?
- C++名称查找来自 <time.h 的函数>
- 为什么即使我反复重置它,srand(time(NULL))也能顺利工作