簡體   English   中英

std :: chrono :: system_clock :: now()。time_since_epoch()`中的時間從哪里來,如果從多個線程訪問,它會阻塞嗎?

[英]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_tstd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM