鍍金池/ 教程/ C/ 2.5 識(shí)別線程
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ù)

2.5 識(shí)別線程

線程標(biāo)識(shí)類型是std::thread::id,可以通過兩種方式進(jìn)行檢索。第一種,可以通過調(diào)用std::thread對(duì)象的成員函數(shù)get_id()來直接獲取。如果std::thread對(duì)象沒有與任何執(zhí)行線程相關(guān)聯(lián),get_id()將返回std::thread::type默認(rèn)構(gòu)造值,這個(gè)值表示“沒有線程”。第二種,當(dāng)前線程中調(diào)用std::this_thread::get_id()(這個(gè)函數(shù)定義在<thread>頭文件中)也可以獲得線程標(biāo)識(shí)。

std::thread::id對(duì)象可以自由的拷貝和對(duì)比,因?yàn)闃?biāo)識(shí)符就可以復(fù)用。如果兩個(gè)對(duì)象的std::thread::id相等,那它們就是同一個(gè)線程,或者都“沒有線程”。如果不等,那么就代表了兩個(gè)不同線程,或者一個(gè)有線程,另一沒有。

線程庫(kù)不會(huì)限制你去檢查線程標(biāo)識(shí)是否一樣,std::thread::id類型對(duì)象提供相當(dāng)豐富的對(duì)比操作;比如,提供為不同的值進(jìn)行排序。這意味著允許程序員將其當(dāng)做為容器的鍵值,做排序,或做其他方式的比較。按默認(rèn)順序比較不同值的std::thread::id,所以這個(gè)行為可預(yù)見的:當(dāng)a<b,b<c時(shí),得a<c,等等。標(biāo)準(zhǔn)庫(kù)也提供std::hash<std::thread::id>容器,所以std::thread::id也可以作為無序容器的鍵值。

std::thread::id實(shí)例常用作檢測(cè)線程是否需要進(jìn)行一些操作,比如:當(dāng)用線程來分割一項(xiàng)工作(如清單2.8),主線程可能要做一些與其他線程不同的工作。這種情況下,啟動(dòng)其他線程前,它可以將自己的線程ID通過std::this_thread::get_id()得到,并進(jìn)行存儲(chǔ)。就是算法核心部分(所有線程都一樣的),每個(gè)線程都要檢查一下,其擁有的線程ID是否與初始線程的ID相同。

std::thread::id master_thread;
void some_core_part_of_algorithm()
{
  if(std::this_thread::get_id()==master_thread)
  {
    do_master_thread_work();
  }
  do_common_work();
}

另外,當(dāng)前線程的std::thread::id將存儲(chǔ)到一個(gè)數(shù)據(jù)結(jié)構(gòu)中。之后在這個(gè)結(jié)構(gòu)體中對(duì)當(dāng)前線程的ID與存儲(chǔ)的線程ID做對(duì)比,來決定操作是被“允許”,還是“需要”(permitted/required)。

同樣,作為線程和本地存儲(chǔ)不適配的替代方案,線程ID在容器中可作為鍵值。例如,容器可以存儲(chǔ)其掌控下每個(gè)線程的信息,或在多個(gè)線程中互傳信息。

std::thread::id可以作為一個(gè)線程的通用標(biāo)識(shí)符,當(dāng)標(biāo)識(shí)符只與語(yǔ)義相關(guān)(比如,數(shù)組的索引)時(shí),就需要這個(gè)方案了。也可以使用輸出流(std::cout)來記錄一個(gè)std::thread::id對(duì)象的值。

std::cout<<std::this_thread::get_id();

具體的輸出結(jié)果是嚴(yán)格依賴于具體實(shí)現(xiàn)的,C++標(biāo)準(zhǔn)的唯一要求就是要保證ID比較結(jié)果相等的線程,必須有相同的輸出。