2017-10-14 732 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可能具有不同的計數器。

相關問題