亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++中Boost.Chrono時間庫的使用方法

 更新時間:2017年09月06日 09:14:05   作者:taozj  
chrono是一個time library, 源于boost,現(xiàn)在已經(jīng)是C++11標(biāo)準(zhǔn)了,下面這篇文章主要給大家介紹了關(guān)于C++中Boost.Chrono時間庫的使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。

前言

大家應(yīng)該都有所體會,時鐘這個東西在程序中扮演者重要的角色,在系統(tǒng)編程的時候睡眠、帶超時的等待、帶超時的條件變量、帶超時的鎖都會用到,但是往往對特定系統(tǒng)依賴性很大,感覺即使不考慮系統(tǒng)的跨平臺性,如果能使用一個穩(wěn)定的接口,同時如果能夠方便的對時刻、時段等進行相關(guān)的操作和運算,將是再好不過的了。

在boost庫中和時間相關(guān)的庫有Boost.DateTime和Boost.Chrono,前者專注于時間時刻以及本地化相關(guān)的內(nèi)容,而后者主要是時刻、時長和時間的計算等內(nèi)容。當(dāng)然,C++11標(biāo)準(zhǔn)已經(jīng)支持std::chrono了,但是為了兼容老編譯系統(tǒng)現(xiàn)在很多C++庫和程序都使用boost.chrono作為時間類庫(還有的原因就是std::chrono沒有收錄boost.chrono的所有功能,比如統(tǒng)計CPU使用時間、自定義時間輸出格式等),不過比較可惜的是即便使用boost::chrono作為權(quán)宜之計,也需要boost-1.47版本之上才行,而現(xiàn)在比較舊的發(fā)行版需要升級boost庫才可以使用。想想現(xiàn)在RHEL-6.x仍然被大規(guī)模的部署,而且RedHat要為這貨提供長達(dá)十年的技術(shù)支持,真不知道啥時候才能順順利利的享受C++11……

Boost.Chrono的時間類型分為duration和time_point,也就是時長和時刻兩類,很多概念和接口都是圍繞這兩個維度去定義和實現(xiàn)的。

一、Clock

clock是Boost.Chrono中的重要概念,而且這些clock都包含一個now()的成員函數(shù),用于返回當(dāng)前的time_point。Boost.Chrono包含的clock類型有:

  (1) chrono::system_clock 代表系統(tǒng)時間,比如電腦上顯示的當(dāng)前時間,其特點是這個時間可以被用戶手動設(shè)置更新,所以這個時鐘是可以和外部時鐘源同步的。這個時鐘還有一個to_time_t()成員函數(shù),用于返回自1970.1.1開始到某個時間點所經(jīng)過的秒數(shù),數(shù)據(jù)類型是std::time_t。這種時鐘通常用來轉(zhuǎn)換成日歷時間使用。

  (2) chrono::steady_clock 其特點是時間是單調(diào)增長的,后一個時刻訪問得到的時間點肯定比之前時刻得到的時間點要晚,即使我們手動將系統(tǒng)時間向前調(diào)整了也不會改變這個時鐘穩(wěn)步向前推行累計,其也被稱為monotonic time,該時鐘是均勻增長且不能被調(diào)整,其特性對于很多不允許時間錯亂的系統(tǒng)是十分重要的。chrono::steady_clock通常是基于系統(tǒng)啟動時間來計時的,而且常常用來進行耗時、等待等工作使用。

  (3) chrono::high_resolution_clock 依賴于系統(tǒng)實現(xiàn),通常是上面兩種時鐘的某個宏定義,取決于哪個時鐘源更為的精確,所以其輸出也決定于取決于上面哪個clock來實現(xiàn)的。

  (4) chrono::process_real_cpu_clock 表示自進程啟動以來使用的CPU時間,而這個數(shù)據(jù)也可以通過使用std::clock()來獲得。chrono::process_user_cpu_clock、boost::chrono::process_system_cpu_clock表示自進程啟動以來,在用戶態(tài)、內(nèi)核態(tài)所花費的時間,而所有的這些事件可以通過chrono::process_cpu_clock來獲得,他返回上面所有時間組成的一個tuple結(jié)構(gòu)。

  (5) chrono::thread_clock 返回基于線程統(tǒng)計的花費時間,而且不區(qū)分用戶態(tài)、內(nèi)核態(tài)的時間。

二、time_point

time_point代表時間點,其等價于某個時刻(clock)+duration的結(jié)果,同時兩個time_point做減法也可以得到一個duration。time_point常見的描述為:3分鐘之后、2038年1月1日10:32:23、定時器啟動后的20ms……

上面的clock都有一個now()成員函數(shù),其返回的就是chrono::time_point類型。這個類型使用一個模板來實現(xiàn)的,所以其實際類型極度依賴于所選擇的時鐘源。

Boost.Chrono有一個chrono::time_point_cast轉(zhuǎn)換函數(shù),可以顯式從高粒度向低粒度對time_point進行轉(zhuǎn)換。

chrono::process_real_cpu_clock::time_point p = chrono::process_real_cpu_clock::now();
std::cout << chrono::time_point_cast<minutes>(p) << '\n';

三、duration

關(guān)于時長,chrono::duration也是一個模板類型,其第一個模板參數(shù)表明存儲所用的數(shù)據(jù)類型(int、long、double等),第二個模板參數(shù)表示ratio(比如24、60、1000等)。為了方便用戶的使用,Boost.Chrono提供了duration常用的六種時間類型,且他們都用一個足夠大的整數(shù)進行內(nèi)部保存,其計量值可以用count()成員函數(shù)得到:

chrono::nanoseconds、chrono::millisecondschrono::microseconds、chrono::seconds、chrono::minutes、chrono::hours,而且為這些類型都重載了計算操作符:+、-、<等,方便時間的計算和比較。文檔說傳統(tǒng)的Boost.DateTime是用繼承實現(xiàn)的,相比而言Boost.Chrono更加的簡潔高效,而且和前者保持了一致的接口。

chrono::steady_clock::time_point start = chrono::steady_clock::now();
...
chrono::duration<double> sec = chrono::steady_clock::now() - start;
std::cout << "we took " << sec.count() << " seconds\n";
auto go = chrono::steady_clock::now() + chrono::nanoseconds(500); 
while (chrono::steady_clock::now() < go) 
... ;

上面的六種time_point類型表示的維度不一,粗粒度的時長肯定能用細(xì)粒度的類型表示,反之則可能丟失精度,所以需要使用chrono::duration_cast()函數(shù)做顯式的轉(zhuǎn)換。

可能上面六種類型的時間不咋的,但重點是現(xiàn)在boost::chrono被廣為使用在boost的其他庫里面,比如我們看一個條件變量的帶超時等待的原型:

template< typename Clock, typename Duration >
cv_status wait_until( std::unique_lock< mutex > & lk,
      std::chrono::time_point< Clock, Duration > const& abs_time);
      
template< typename Rep, typename Period >
cv_status wait_for( std::unique_lock< mutex > & lk,
     std::chrono::duration< Rep, Period > const& rel_time);

這就意味著我們可以直接將chrono::minutes{2}這樣的duration對象丟給這個函數(shù)就好了,創(chuàng)建任意精度的時長都很方便,而不用像以前一樣關(guān)注函數(shù)接口有人用seconds、有人用milliseconds、有人用timeval了。

現(xiàn)在boost庫和標(biāo)準(zhǔn)庫中,基于時間段超時的函數(shù)都具有for后綴,而基于時間點超時的變量具有until后綴,比如this_thread::sleep_for()this_thread::sleep_until()類似的還有:wait、try_lock、unique_lock用于條件變量、mutex互斥、unique_lock操作。

四、自定義格式的時間輸出

通過time_fmt()可以對時刻進行格式化輸出,使用的時候需要包含頭文件。

time_fmt(boost::chrono::timezone::local, "%H:%M:%S");
time_fmt(boost::chrono::timezone::utc, "%H:%M:%S");

參考

Chapter 37. Boost.Chrono

Chapter 8. Boost.Chrono 2.0.5

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • C語言中字符串的內(nèi)存地址操作的相關(guān)函數(shù)簡介

    C語言中字符串的內(nèi)存地址操作的相關(guān)函數(shù)簡介

    這篇文章主要介紹了C語言中字符串的內(nèi)存地址操作的相關(guān)函數(shù),包括bcopy()函數(shù)和bzero()函數(shù)以及bcmp()函數(shù),需要的朋友可以參考下
    2015-08-08
  • C語言struct結(jié)構(gòu)體介紹

    C語言struct結(jié)構(gòu)體介紹

    C語言中,結(jié)構(gòu)體類型屬于一種構(gòu)造類型(其他的構(gòu)造類型還有:數(shù)組類型,聯(lián)合類型),下面這篇文章主要給大家介紹了關(guān)于C語言結(jié)構(gòu)體(struct)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • C語言實現(xiàn)靜態(tài)鏈表

    C語言實現(xiàn)靜態(tài)鏈表

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)靜態(tài)鏈表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • vscode 配置 C/C++ 編譯環(huán)境的詳細(xì)圖文教程

    vscode 配置 C/C++ 編譯環(huán)境的詳細(xì)圖文教程

    這篇文章主要介紹了vscode 配置 C/C++ 編譯環(huán)境的詳細(xì)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • C語言單鏈隊列的表示與實現(xiàn)實例詳解

    C語言單鏈隊列的表示與實現(xiàn)實例詳解

    這篇文章主要介紹了C語言單鏈隊列的表示與實現(xiàn),對于研究數(shù)據(jù)結(jié)構(gòu)與算法的朋友來說很有參考借鑒價值,需要的朋友可以參考下
    2014-07-07
  • 一文帶你搞懂C++中的流量控制

    一文帶你搞懂C++中的流量控制

    限流可以認(rèn)為服務(wù)降級的一種,限流就是限制系統(tǒng)的輸入和輸出流量已達(dá)到保護系統(tǒng)的目的,這篇文章小編就來帶大家深入了解一下如何利用C++實現(xiàn)流量控制吧
    2023-10-10
  • Linux下編譯C程序的過程

    Linux下編譯C程序的過程

    我們總是在Linux下輸入 gcc -o app main.c 即可編譯好程序,對于具體的詳細(xì)過程及流程,相信親們就不太了解啦!下面給大家展示一下C編譯器的解釋全過程。
    2016-01-01
  • C++ sleep()和usleep()的區(qū)別

    C++ sleep()和usleep()的區(qū)別

    本文主要介紹了C++ sleep()和usleep()的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • C++程序設(shè)計-五子棋

    C++程序設(shè)計-五子棋

    本文將以簡單的存儲結(jié)構(gòu)及簡單的運算,條件語句,分支語句,循環(huán)語句結(jié)合,帶來一個雙人對戰(zhàn)版五子棋,這是一個簡單的模型,實現(xiàn)了五子棋最最基本的功能。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • C語言實現(xiàn)順序表的順序查找和折半查找

    C語言實現(xiàn)順序表的順序查找和折半查找

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)順序表的順序查找和折半查找,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06

最新評論