鍍金池/ 教程/ C/ D.1 <chrono>頭文件
3.4 本章總結(jié)
6.3 基于鎖設(shè)計(jì)更加復(fù)雜的數(shù)據(jù)結(jié)構(gòu)
6.1 為并發(fā)設(shè)計(jì)的意義何在?
5.2 <code>C++</code>中的原子操作和原子類型
A.7 自動(dòng)推導(dǎo)變量類型
2.1 線程管理的基礎(chǔ)
8.5 在實(shí)踐中設(shè)計(jì)并發(fā)代碼
2.4 運(yùn)行時(shí)決定線程數(shù)量
2.2 向線程函數(shù)傳遞參數(shù)
第4章 同步并發(fā)操作
2.3 轉(zhuǎn)移線程所有權(quán)
8.3 為多線程性能設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)
6.4 本章總結(jié)
7.3 對(duì)于設(shè)計(jì)無鎖數(shù)據(jù)結(jié)構(gòu)的指導(dǎo)建議
關(guān)于這本書
A.1 右值引用
2.6 本章總結(jié)
D.2 &lt;condition_variable&gt;頭文件
A.6 變參模板
6.2 基于鎖的并發(fā)數(shù)據(jù)結(jié)構(gòu)
4.5 本章總結(jié)
A.9 本章總結(jié)
前言
第10章 多線程程序的測(cè)試和調(diào)試
5.4 本章總結(jié)
第9章 高級(jí)線程管理
5.1 內(nèi)存模型基礎(chǔ)
2.5 識(shí)別線程
第1章 你好,C++的并發(fā)世界!
1.2 為什么使用并發(fā)?
A.5 Lambda函數(shù)
第2章 線程管理
4.3 限定等待時(shí)間
D.3 &lt;atomic&gt;頭文件
10.2 定位并發(fā)錯(cuò)誤的技術(shù)
附錄B 并發(fā)庫(kù)的簡(jiǎn)單比較
5.3 同步操作和強(qiáng)制排序
A.8 線程本地變量
第8章 并發(fā)代碼設(shè)計(jì)
3.3 保護(hù)共享數(shù)據(jù)的替代設(shè)施
附錄D C++線程庫(kù)參考
第7章 無鎖并發(fā)數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)
D.7 &lt;thread&gt;頭文件
D.1 &lt;chrono&gt;頭文件
4.1 等待一個(gè)事件或其他條件
A.3 默認(rèn)函數(shù)
附錄A 對(duì)<code>C++</code>11語(yǔ)言特性的簡(jiǎn)要介紹
第6章 基于鎖的并發(fā)數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)
封面圖片介紹
7.2 無鎖數(shù)據(jù)結(jié)構(gòu)的例子
8.6 本章總結(jié)
8.1 線程間劃分工作的技術(shù)
4.2 使用期望等待一次性事件
8.4 設(shè)計(jì)并發(fā)代碼的注意事項(xiàng)
D.5 &lt;mutex&gt;頭文件
3.1 共享數(shù)據(jù)帶來的問題
資源
9.3 本章總結(jié)
10.3 本章總結(jié)
10.1 與并發(fā)相關(guān)的錯(cuò)誤類型
D.4 &lt;future&gt;頭文件
3.2 使用互斥量保護(hù)共享數(shù)據(jù)
9.1 線程池
1.1 何謂并發(fā)
9.2 中斷線程
4.4 使用同步操作簡(jiǎn)化代碼
A.2 刪除函數(shù)
1.3 C++中的并發(fā)和多線程
1.4 開始入門
第5章 C++內(nèi)存模型和原子類型操作
消息傳遞框架與完整的ATM示例
8.2 影響并發(fā)代碼性能的因素
7.1 定義和意義
D.6 &lt;ratio&gt;頭文件
A.4 常量表達(dá)式函數(shù)
7.4 本章總結(jié)
1.5 本章總結(jié)
第3章 線程間共享數(shù)據(jù)

D.1 &lt;chrono&gt;頭文件

<chrono>頭文件作為time_point的提供者,具有代表時(shí)間點(diǎn)的類,duration類和時(shí)鐘類。每個(gè)時(shí)鐘都有一個(gè)is_steady靜態(tài)數(shù)據(jù)成員,這個(gè)成員用來表示該時(shí)鐘是否是一個(gè)穩(wěn)定的時(shí)鐘(以勻速計(jì)時(shí)的時(shí)鐘,且不可調(diào)節(jié))。std::chrono::steady_clock是唯一個(gè)能保證穩(wěn)定的時(shí)鐘類。

頭文件正文

namespace std
{
  namespace chrono
  {
    template<typename Rep,typename Period = ratio<1>>
    class duration;
    template<
        typename Clock,
        typename Duration = typename Clock::duration>
    class time_point;
    class system_clock;
    class steady_clock;
    typedef unspecified-clock-type high_resolution_clock;
  }
}

D.1.1 std::chrono::duration類型模板

std::chrono::duration類模板可以用來表示時(shí)間。模板參數(shù)RepPeriod是用來存儲(chǔ)持續(xù)時(shí)間的數(shù)據(jù)類型,std::ratio實(shí)例代表了時(shí)間的長(zhǎng)度(幾分之一秒),其表示了在兩次“時(shí)鐘滴答”后的時(shí)間(時(shí)鐘周期)。因此,std::chrono::duration<int, std::milli>即為,時(shí)間以毫秒數(shù)的形式存儲(chǔ)到int類型中,而std::chrono::duration<short, std::ratio<1,50>>則是記錄1/50秒的個(gè)數(shù),并將個(gè)數(shù)存入short類型的變量中,還有std::chrono::duration <long long, std::ratio<60,1>>則是將分鐘數(shù)存儲(chǔ)到long long類型的變量中。

類的定義

template <class Rep, class Period=ratio<1> >
class duration
{
public:
  typedef Rep rep;
  typedef Period period;

  constexpr duration() = default;
  ~duration() = default;

  duration(const duration&) = default;
  duration& operator=(const duration&) = default;

  template <class Rep2>
  constexpr explicit duration(const Rep2& r);

  template <class Rep2, class Period2>
  constexpr duration(const duration<Rep2, Period2>& d);

  constexpr rep count() const;
  constexpr duration operator+() const;
  constexpr duration operator-() const;

  duration& operator++();
  duration operator++(int);
  duration& operator--();
  duration operator--(int);

  duration& operator+=(const duration& d);
  duration& operator-=(const duration& d);
  duration& operator*=(const rep& rhs);
  duration& operator/=(const rep& rhs);

  duration& operator%=(const rep& rhs);
  duration& operator%=(const duration& rhs);

  static constexpr duration zero();
  static constexpr duration min();
  static constexpr duration max();
};

template <class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator==(
    const duration<Rep1, Period1>& lhs,
    const duration<Rep2, Period2>& rhs);

template <class Rep1, class Period1, class Rep2, class Period2>
    constexpr bool operator!=(
    const duration<Rep1, Period1>& lhs,
    const duration<Rep2, Period2>& rhs);

template <class Rep1, class Period1, class Rep2, class Period2>
    constexpr bool operator<(
    const duration<Rep1, Period1>& lhs,
    const duration<Rep2, Period2>& rhs);

template <class Rep1, class Period1, class Rep2, class Period2>
    constexpr bool operator<=(
    const duration<Rep1, Period1>& lhs,
    const duration<Rep2, Period2>& rhs);

template <class Rep1, class Period1, class Rep2, class Period2>
    constexpr bool operator>(
    const duration<Rep1, Period1>& lhs,
    const duration<Rep2, Period2>& rhs);

template <class Rep1, class Period1, class Rep2, class Period2>
    constexpr bool operator>=(
    const duration<Rep1, Period1>& lhs,
    const duration<Rep2, Period2>& rhs);

template <class ToDuration, class Rep, class Period>
    constexpr ToDuration duration_cast(const duration<Rep, Period>& d);

要求
Rep必須是內(nèi)置數(shù)值類型,或是自定義的類數(shù)值類型。

Period必須是std::ratio<>實(shí)例。

std::chrono::duration::Rep 類型

用來記錄dration中時(shí)鐘周期的數(shù)量。

聲明

typedef Rep rep;

rep類型用來記錄duration對(duì)象內(nèi)部的表示。

std::chrono::duration::Period 類型

這個(gè)類型必須是一個(gè)std::ratio的特化實(shí)例,用來表示在繼續(xù)時(shí)間中,1s所要記錄的次數(shù)。例如,當(dāng)periodstd::ratio<1, 50>duration變量的count()就會(huì)在N秒鐘返回50N。

聲明

typedef Period period;

std::chrono::duration 默認(rèn)構(gòu)造函數(shù)

使用默認(rèn)值構(gòu)造std::chrono::duration實(shí)例

聲明

constexpr duration() = default;

效果
duration內(nèi)部值(例如rep類型的值)都已初始化。

std::chrono::duration 需要計(jì)數(shù)值的轉(zhuǎn)換構(gòu)造函數(shù)

通過給定的數(shù)值來構(gòu)造std::chrono::duration實(shí)例。

聲明

template <class Rep2>;
constexpr explicit duration(const Rep2& r);

效果
duration對(duì)象的內(nèi)部值會(huì)使用static_cast<rep>(r)進(jìn)行初始化。

結(jié)果
當(dāng)Rep2隱式轉(zhuǎn)換為Rep,Rep是浮點(diǎn)類型或Rep2不是浮點(diǎn)類型,這個(gè)構(gòu)造函數(shù)才能使用。

后驗(yàn)條件

this->count()==static_cast<rep>(r)

std::chrono::duration 需要另一個(gè)std::chrono::duration值的轉(zhuǎn)化構(gòu)造函數(shù)

通過另一個(gè)std::chrono::duration類實(shí)例中的計(jì)數(shù)值來構(gòu)造一個(gè)std::chrono::duration類實(shí)例。

聲明

template <class Rep2, class Period>
constexpr duration(const duration<Rep2,Period2>& d);

結(jié)果
duration對(duì)象的內(nèi)部值通過duration_cast<duration<Rep,Period>>(d).count()初始化。

要求
當(dāng)Rep是一個(gè)浮點(diǎn)類或Rep2不是浮點(diǎn)類,且Period2是Period數(shù)的倍數(shù)(比如,ratio_divide<Period2,Period>::den==1)時(shí),才能調(diào)用該重載。當(dāng)一個(gè)較小的數(shù)據(jù)轉(zhuǎn)換為一個(gè)較大的數(shù)據(jù)時(shí),使用該構(gòu)造函數(shù)就能避免數(shù)位截?cái)嗪途葥p失。

后驗(yàn)條件
this->count() == dutation_cast&lt;duration<Rep, Period>>(d).count()

例子

duration<int, ratio<1, 1000>> ms(5);  // 5毫秒
duration<int, ratio<1, 1>> s(ms);  // 錯(cuò)誤:不能將ms當(dāng)做s進(jìn)行存儲(chǔ)
duration<double, ratio<1,1>> s2(ms);  // 合法:s2.count() == 0.005
duration<int, ration<1, 1000000>> us<ms>;  // 合法:us.count() == 5000

std::chrono::duration::count 成員函數(shù)

查詢持續(xù)時(shí)長(zhǎng)。

聲明

constexpr rep count() const;

返回
返回duration的內(nèi)部值,其值類型和rep一樣。

std::chrono::duration::operator+ 加法操作符

這是一個(gè)空操作:只會(huì)返回*this的副本。

聲明

constexpr duration operator+() const;

返回 *this

std::chrono::duration::operator- 減法操作符

返回將內(nèi)部值只為負(fù)數(shù)的*this副本。

聲明

constexpr duration operator-() const;

返回 duration(--this->count());

std::chrono::duration::operator++ 前置自加操作符

增加內(nèi)部計(jì)數(shù)值。

聲明

duration& operator++();

結(jié)果

++this->internal_count;

返回 *this

std::chrono::duration::operator++ 后置自加操作符

自加內(nèi)部計(jì)數(shù)值,并且返回還沒有增加前的*this。

聲明

duration operator++(int);

結(jié)果

duration temp(*this);
++(*this);
return temp;

std::chrono::duration::operator-- 前置自減操作符

自減內(nèi)部計(jì)數(shù)值

聲明

duration& operator--();

結(jié)果

--this->internal_count;

返回 *this

std::chrono::duration::operator-- 前置自減操作符

自減內(nèi)部計(jì)數(shù)值,并且返回還沒有減少前的*this。

聲明

duration operator--(int);

結(jié)果

duration temp(*this);
--(*this);
return temp;

std::chrono::duration::operator+= 復(fù)合賦值操作符

將其他duration對(duì)象中的內(nèi)部值增加到現(xiàn)有duration對(duì)象當(dāng)中。

聲明

duration& operator+=(duration const& other);

結(jié)果

internal_count+=other.count();

返回 *this

std::chrono::duration::operator-= 復(fù)合賦值操作符

現(xiàn)有duration對(duì)象減去其他duration對(duì)象中的內(nèi)部值。

聲明

duration& operator-=(duration const& other);

結(jié)果

internal_count-=other.count();

返回 *this

std::chrono::duration::operator*= 復(fù)合賦值操作符

內(nèi)部值乘以一個(gè)給定的值。

聲明

duration& operator*=(rep const& rhs);

結(jié)果

internal_count*=rhs;

返回 *this

std::chrono::duration::operator/= 復(fù)合賦值操作符

內(nèi)部值除以一個(gè)給定的值。

聲明

duration& operator/=(rep const& rhs);

結(jié)果

internal_count/=rhs;

返回 *this

std::chrono::duration::operator%= 復(fù)合賦值操作符

內(nèi)部值對(duì)一個(gè)給定的值求余。

聲明

duration& operator%=(rep const& rhs);

結(jié)果

internal_count%=rhs;

返回 *this

std::chrono::duration::operator%= 復(fù)合賦值操作符(重載)

內(nèi)部值對(duì)另一個(gè)duration類的內(nèi)部值求余。

聲明

duration& operator%=(duration const& rhs);

結(jié)果

internal_count%=rhs.count();

返回 *this

std::chrono::duration::zero 靜態(tài)成員函數(shù)

返回一個(gè)內(nèi)部值為0的duration對(duì)象。

聲明

constexpr duration zero();

返回

duration(duration_values<rep>::zero());

std::chrono::duration::min 靜態(tài)成員函數(shù)

返回duration類實(shí)例化后能表示的最小值。

聲明

constexpr duration min();

返回

duration(duration_values<rep>::min());

std::chrono::duration::max 靜態(tài)成員函數(shù)

返回duration類實(shí)例化后能表示的最大值。

聲明

constexpr duration max();

返回

duration(duration_values<rep>::max());

std::chrono::duration 等于比較操作符

比較兩個(gè)duration對(duì)象是否相等。

聲明

template <class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator==(
const duration<Rep1, Period1>& lhs,
const duration<Rep2, Period2>& rhs);

要求
lhsrhs兩種類型可以互相進(jìn)行隱式轉(zhuǎn)換。當(dāng)兩種類型無法進(jìn)行隱式轉(zhuǎn)換,或是可以互相轉(zhuǎn)換的兩個(gè)不同類型的duration類,則表達(dá)式不合理。

結(jié)果
當(dāng)CommonDurationstd::common_type< duration< Rep1, Period1>, duration< Rep2, Period2>>::type同類,那么lhs==rhs就會(huì)返回CommonDuration(lhs).count()==CommonDuration(rhs).count()。

std::chrono::duration 不等于比較操作符

比較兩個(gè)duration對(duì)象是否不相等。

聲明

template <class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator!=(
   const duration<Rep1, Period1>& lhs,
   const duration<Rep2, Period2>& rhs);

要求
lhsrhs兩種類型可以互相進(jìn)行隱式轉(zhuǎn)換。當(dāng)兩種類型無法進(jìn)行隱式轉(zhuǎn)換,或是可以互相轉(zhuǎn)換的兩個(gè)不同類型的duration類,則表達(dá)式不合理。

返回 !(lhs==rhs)

std::chrono::duration 小于比較操作符

比較兩個(gè)duration對(duì)象是否小于。

聲明

template <class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator<(
   const duration<Rep1, Period1>& lhs,
   const duration<Rep2, Period2>& rhs);

要求
lhsrhs兩種類型可以互相進(jìn)行隱式轉(zhuǎn)換。當(dāng)兩種類型無法進(jìn)行隱式轉(zhuǎn)換,或是可以互相轉(zhuǎn)換的兩個(gè)不同類型的duration類,則表達(dá)式不合理。

結(jié)果
當(dāng)CommonDurationstd::common_type< duration< Rep1, Period1>, duration< Rep2, Period2>>::type同類,那么lhs&lt;rhs就會(huì)返回CommonDuration(lhs).count()&lt;CommonDuration(rhs).count()。

std::chrono::duration 大于比較操作符

比較兩個(gè)duration對(duì)象是否大于。

聲明

template <class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator>(
   const duration<Rep1, Period1>& lhs,
   const duration<Rep2, Period2>& rhs);

要求
lhsrhs兩種類型可以互相進(jìn)行隱式轉(zhuǎn)換。當(dāng)兩種類型無法進(jìn)行隱式轉(zhuǎn)換,或是可以互相轉(zhuǎn)換的兩個(gè)不同類型的duration類,則表達(dá)式不合理。

返回 rhs<lhs

std::chrono::duration 小于等于比較操作符

比較兩個(gè)duration對(duì)象是否小于等于。

聲明

template <class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator<=(
   const duration<Rep1, Period1>& lhs,
   const duration<Rep2, Period2>& rhs);

要求
lhsrhs兩種類型可以互相進(jìn)行隱式轉(zhuǎn)換。當(dāng)兩種類型無法進(jìn)行隱式轉(zhuǎn)換,或是可以互相轉(zhuǎn)換的兩個(gè)不同類型的duration類,則表達(dá)式不合理。

返回 !(rhs<lhs)

std::chrono::duration 大于等于比較操作符

比較兩個(gè)duration對(duì)象是否大于等于。

聲明

template <class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator>=(
   const duration<Rep1, Period1>& lhs,
   const duration<Rep2, Period2>& rhs);

要求
lhsrhs兩種類型可以互相進(jìn)行隱式轉(zhuǎn)換。當(dāng)兩種類型無法進(jìn)行隱式轉(zhuǎn)換,或是可以互相轉(zhuǎn)換的兩個(gè)不同類型的duration類,則表達(dá)式不合理。

返回 !(lhs<rhs)

std::chrono::duration_cast 非成員函數(shù)

顯示將一個(gè)std::chrono::duration對(duì)象轉(zhuǎn)化為另一個(gè)std::chrono::duration實(shí)例。

聲明

template <class ToDuration, class Rep, class Period>
constexpr ToDuration duration_cast(const duration<Rep, Period>& d);

要求
ToDuration必須是std::chrono::duration的實(shí)例。

返回
duration類d轉(zhuǎn)換為指定類型ToDuration。這種方式可以在不同尺寸和表示類型的轉(zhuǎn)換中盡可能減少精度損失。

D.1.2 std::chrono::time_point類型模板

std::chrono::time_point類型模板通過(特別的)時(shí)鐘來表示某個(gè)時(shí)間點(diǎn)。這個(gè)時(shí)鐘代表的是從epoch(1970-01-01 00:00:00 UTC,作為UNIX系列系統(tǒng)的特定時(shí)間戳)到現(xiàn)在的時(shí)間。模板參數(shù)Clock代表使用的使用(不同的使用必定有自己獨(dú)特的類型),而Duration模板參數(shù)使用來測(cè)量從epoch到現(xiàn)在的時(shí)間,并且這個(gè)參數(shù)的類型必須是std::chrono::duration類型。Duration默認(rèn)存儲(chǔ)Clock上的測(cè)量值。

類型定義

template <class Clock,class Duration = typename Clock::duration>
class time_point
{
public:
  typedef Clock clock;
  typedef Duration duration;
  typedef typename duration::rep rep;
  typedef typename duration::period period;

  time_point();
  explicit time_point(const duration& d);

  template <class Duration2>
  time_point(const time_point<clock, Duration2>& t);

  duration time_since_epoch() const;

  time_point& operator+=(const duration& d);
  time_point& operator-=(const duration& d);

  static constexpr time_point min();
  static constexpr time_point max();
};

std::chrono::time_point 默認(rèn)構(gòu)造函數(shù)

構(gòu)造time_point代表著,使用相關(guān)的Clock,記錄從epoch到現(xiàn)在的時(shí)間;其內(nèi)部計(jì)時(shí)使用Duration::zero()進(jìn)行初始化。

聲明

time_point();

后驗(yàn)條件
對(duì)于使用默認(rèn)構(gòu)造函數(shù)構(gòu)造出的time_point對(duì)象tp,tp.time_since_epoch() == tp::duration::zero()

std::chrono::time_point 需要時(shí)間長(zhǎng)度的構(gòu)造函數(shù)

構(gòu)造time_point代表著,使用相關(guān)的Clock,記錄從epoch到現(xiàn)在的時(shí)間。

聲明

explicit time_point(const duration& d);

后驗(yàn)條件
當(dāng)有一個(gè)time_point對(duì)象tp,是通過duration d構(gòu)造出來的(tp(d)),那么tp.time_since_epoch() == d。

std::chrono::time_point 轉(zhuǎn)換構(gòu)造函數(shù)

構(gòu)造time_point代表著,使用相關(guān)的Clock,記錄從epoch到現(xiàn)在的時(shí)間。

聲明

template <class Duration2>
time_point(const time_point<clock, Duration2>& t);

要求
Duration2必須呢個(gè)隱式轉(zhuǎn)換為Duration。

效果
當(dāng)time_point(t.time_since_epoch())存在,從t.time_since_epoch()中獲取的返回值,可以隱式轉(zhuǎn)換成Duration類型的對(duì)象,并且這個(gè)值可以存儲(chǔ)在一個(gè)新的time_point對(duì)象中。

(擴(kuò)展閱讀:as-if準(zhǔn)則)

std::chrono::time_point::time_since_epoch 成員函數(shù)

返回當(dāng)前time_point從epoch到現(xiàn)在的具體時(shí)長(zhǎng)。

聲明

duration time_since_epoch() const;

返回
duration的值存儲(chǔ)在*this中。

std::chrono::time_point::operator+= 復(fù)合賦值函數(shù)

將指定的duration的值與原存儲(chǔ)在指定的time_point對(duì)象中的duration相加,并將加后值存儲(chǔ)在*this對(duì)象中。

聲明

time_point& operator+=(const duration& d);

效果
將d的值和duration對(duì)象的值相加,存儲(chǔ)在*this中,就如同this->internal_duration += d;

返回 *this

std::chrono::time_point::operator-= 復(fù)合賦值函數(shù)

將指定的duration的值與原存儲(chǔ)在指定的time_point對(duì)象中的duration相減,并將加后值存儲(chǔ)在*this對(duì)象中。

聲明

time_point& operator-=(const duration& d);

效果
將d的值和duration對(duì)象的值相減,存儲(chǔ)在*this中,就如同this->internal_duration -= d;

返回 *this

std::chrono::time_point::min 靜態(tài)成員函數(shù)

獲取time_point對(duì)象可能表示的最小值。

聲明

static constexpr time_point min();

返回

time_point(time_point::duration::min()) (see 11.1.1.15)

std::chrono::time_point::max 靜態(tài)成員函數(shù)

獲取time_point對(duì)象可能表示的最大值。

聲明

static constexpr time_point max();

返回

time_point(time_point::duration::max()) (see 11.1.1.16)

D.1.3 std::chrono::system_clock類

std::chrono::system_clock類提供給了從系統(tǒng)實(shí)時(shí)時(shí)鐘上獲取當(dāng)前時(shí)間功能??梢哉{(diào)用std::chrono::system_clock::now()來獲取當(dāng)前的時(shí)間。std::chrono::system_clock::time_point也可以通過std::chrono::system_clock::to_time_t()std::chrono::system_clock::to_time_point()函數(shù)返回值轉(zhuǎn)換成time_t類型。系統(tǒng)時(shí)鐘不穩(wěn)定,所以std::chrono::system_clock::now()獲取到的時(shí)間可能會(huì)早于之前的一次調(diào)用(比如,時(shí)鐘被手動(dòng)調(diào)整過或與外部時(shí)鐘進(jìn)行了同步)。

類型定義

class system_clock
{
public:
  typedef unspecified-integral-type rep;
  typedef std::ratio<unspecified,unspecified> period;
  typedef std::chrono::duration<rep,period> duration;
  typedef std::chrono::time_point<system_clock> time_point;
  static const bool is_steady=unspecified;

  static time_point now() noexcept;

  static time_t to_time_t(const time_point& t) noexcept;
  static time_point from_time_t(time_t t) noexcept;
};

std::chrono::system_clock::rep 類型定義

將時(shí)間周期數(shù)記錄在一個(gè)duration值中

聲明

typedef unspecified-integral-type rep;

std::chrono::system_clock::period 類型定義

類型為std::ratio類型模板,通過在兩個(gè)不同的duration或time_point間特化最小秒數(shù)(或?qū)?秒分為好幾份)。period指定了時(shí)鐘的精度,而非時(shí)鐘頻率。

聲明

typedef std::ratio<unspecified,unspecified> period;

std::chrono::system_clock::duration 類型定義

類型為std::ratio類型模板,通過系統(tǒng)實(shí)時(shí)時(shí)鐘獲取兩個(gè)時(shí)間點(diǎn)之間的時(shí)長(zhǎng)。

聲明

typedef std::chrono::duration<
   std::chrono::system_clock::rep,
   std::chrono::system_clock::period> duration;

std::chrono::system_clock::time_point 類型定義

類型為std::ratio類型模板,通過系統(tǒng)實(shí)時(shí)時(shí)鐘獲取當(dāng)前時(shí)間點(diǎn)的時(shí)間。

聲明

typedef std::chrono::time_point&lt;std::chrono::system_clock&gt; time_point;

std::chrono::system_clock::now 靜態(tài)成員函數(shù)

從系統(tǒng)實(shí)時(shí)時(shí)鐘上獲取當(dāng)前的外部設(shè)備顯示的時(shí)間。

聲明

time_point now() noexcept;

返回
time_point類型變量來代表當(dāng)前系統(tǒng)實(shí)時(shí)時(shí)鐘的時(shí)間。

拋出
當(dāng)錯(cuò)誤發(fā)生,std::system_error異常將會(huì)拋出。

std::chrono::system_clock:to_time_t 靜態(tài)成員函數(shù)

將time_point類型值轉(zhuǎn)化為time_t。

聲明

time_t to_time_t(time_point const& t) noexcept;

返回
通過對(duì)t進(jìn)行舍入或截?cái)嗑?,將其轉(zhuǎn)化為一個(gè)time_t類型的值。

拋出
當(dāng)錯(cuò)誤發(fā)生,std::system_error異常將會(huì)拋出。

std::chrono::system_clock::from_time_t 靜態(tài)成員函數(shù)

聲明

time_point from_time_t(time_t const& t) noexcept;

返回
time_point中的值與t中的值一樣。

拋出
當(dāng)錯(cuò)誤發(fā)生,std::system_error異常將會(huì)拋出。

D.1.4 std::chrono::steady_clock類

std::chrono::steady_clock能訪問系統(tǒng)穩(wěn)定時(shí)鐘??梢酝ㄟ^調(diào)用std::chrono::steady_clock::now()獲取當(dāng)前的時(shí)間。設(shè)備上顯示的時(shí)間,與使用std::chrono::steady_clock::now()獲取的時(shí)間沒有固定的關(guān)系。穩(wěn)定時(shí)鐘是無法回調(diào)的,所以在std::chrono::steady_clock::now()兩次調(diào)用后,第二次調(diào)用獲取的時(shí)間必定等于或大于第一次獲得的時(shí)間。時(shí)鐘以固定的速率進(jìn)行計(jì)時(shí)。

類型定義

class steady_clock
{
public:
  typedef unspecified-integral-type rep;
  typedef std::ratio<
      unspecified,unspecified> period;
  typedef std::chrono::duration<rep,period> duration;
  typedef std::chrono::time_point<steady_clock>
      time_point;
  static const bool is_steady=true;

  static time_point now() noexcept;
};

std::chrono::steady_clock::rep 類型定義

定義一個(gè)整型,用來保存duration的值。

聲明

typedef unspecified-integral-type rep;

std::chrono::steady_clock::period 類型定義

類型為std::ratio類型模板,通過在兩個(gè)不同的duration或time_point間特化最小秒數(shù)(或?qū)?秒分為好幾份)。period指定了時(shí)鐘的精度,而非時(shí)鐘頻率。

聲明

typedef std::ratio<unspecified,unspecified> period;

std::chrono::steady_clock::duration 類型定義

類型為std::ratio類型模板,通過系統(tǒng)實(shí)時(shí)時(shí)鐘獲取兩個(gè)時(shí)間點(diǎn)之間的時(shí)長(zhǎng)。

聲明

typedef std::chrono::duration<
   std::chrono::system_clock::rep,
   std::chrono::system_clock::period> duration;

std::chrono::steady_clock::time_point 類型定義

std::chrono::time_point類型實(shí)例,可以存儲(chǔ)從系統(tǒng)穩(wěn)定時(shí)鐘返回的時(shí)間點(diǎn)。

聲明

typedef std::chrono::time_point<std::chrono::steady_clock> time_point;

std::chrono::steady_clock::now 靜態(tài)成員函數(shù)

從系統(tǒng)穩(wěn)定時(shí)鐘獲取當(dāng)前時(shí)間。

聲明

time_point now() noexcept;

返回
time_point表示當(dāng)前系統(tǒng)穩(wěn)定時(shí)鐘的時(shí)間。

拋出
當(dāng)遇到錯(cuò)誤,會(huì)拋出std::system_error異常。

同步
當(dāng)先行調(diào)用過一次std::chrono::steady_clock::now(),那么下一次time_point獲取的值,一定大于等于第一次獲取的值。

D.1.5 std::chrono::high_resolution_clock類定義

td::chrono::high_resolution_clock類能訪問系統(tǒng)高精度時(shí)鐘。和所有其他時(shí)鐘一樣,通過調(diào)用std::chrono::high_resolution_clock::now()來獲取當(dāng)前時(shí)間。std::chrono::high_resolution_clock可能是std::chrono::system_clock類或std::chrono::steady_clock類的別名,也可能就是獨(dú)立的一個(gè)類。

通過std::chrono::high_resolution_clock具有所有標(biāo)準(zhǔn)庫(kù)支持時(shí)鐘中最高的精度,這就意味著使用 std::chrono::high_resolution_clock::now()要花掉一些時(shí)間。所以,當(dāng)你再調(diào)用std::chrono::high_resolution_clock::now()的時(shí)候,需要注意函數(shù)本身的時(shí)間開銷。

類型定義

class high_resolution_clock
{
public:
  typedef unspecified-integral-type rep;
  typedef std::ratio<
      unspecified,unspecified> period;
  typedef std::chrono::duration<rep,period> duration;
  typedef std::chrono::time_point<
      unspecified> time_point;
  static const bool is_steady=unspecified;

  static time_point now() noexcept;
};