線程標識類型是std::thread::id,可以通過兩種方式進行檢索。第一種,可以通過調用std::thread對象的成員函數(shù)get_id()來直接獲取。如果std::thread對象沒有與任何執(zhí)行線程相關聯(lián),get_id()將返回std::thread::type默認構造值,這個值表示“沒有線程”。第二種,當前線程中調用std::this_thread::get_id()(這個函數(shù)定義在<thread>頭文件中)也可以獲得線程標識。
std::thread::id對象可以自由的拷貝和對比,因為標識符就可以復用。如果兩個對象的std::thread::id相等,那它們就是同一個線程,或者都“沒有線程”。如果不等,那么就代表了兩個不同線程,或者一個有線程,另一沒有。
線程庫不會限制你去檢查線程標識是否一樣,std::thread::id類型對象提供相當豐富的對比操作;比如,提供為不同的值進行排序。這意味著允許程序員將其當做為容器的鍵值,做排序,或做其他方式的比較。按默認順序比較不同值的std::thread::id,所以這個行為可預見的:當a<b,b<c時,得a<c,等等。標準庫也提供std::hash<std::thread::id>容器,所以std::thread::id也可以作為無序容器的鍵值。
std::thread::id實例常用作檢測線程是否需要進行一些操作,比如:當用線程來分割一項工作(如清單2.8),主線程可能要做一些與其他線程不同的工作。這種情況下,啟動其他線程前,它可以將自己的線程ID通過std::this_thread::get_id()得到,并進行存儲。就是算法核心部分(所有線程都一樣的),每個線程都要檢查一下,其擁有的線程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();
}
另外,當前線程的std::thread::id將存儲到一個數(shù)據(jù)結構中。之后在這個結構體中對當前線程的ID與存儲的線程ID做對比,來決定操作是被“允許”,還是“需要”(permitted/required)。
同樣,作為線程和本地存儲不適配的替代方案,線程ID在容器中可作為鍵值。例如,容器可以存儲其掌控下每個線程的信息,或在多個線程中互傳信息。
std::thread::id可以作為一個線程的通用標識符,當標識符只與語義相關(比如,數(shù)組的索引)時,就需要這個方案了。也可以使用輸出流(std::cout)來記錄一個std::thread::id對象的值。
std::cout<<std::this_thread::get_id();
具體的輸出結果是嚴格依賴于具體實現(xiàn)的,C++標準的唯一要求就是要保證ID比較結果相等的線程,必須有相同的輸出。