![](/img/trans.png)
[英]Does the value of std::chrono::system_clock.now().time_since_epoch().count() increase monotonically?
[英]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_t
和std::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.