2016-11-04 26 views
0

我可以打印線程ID來安慰方式如下:是否this_thread :: get_id()總是與每一個新的線程遞增開始

cout << "thread ID: " << std::this_thread::get_id() << endl; 

在此之後的ID打印到控制檯對應於可以在Visual找到標識2013工作室下社區:

Debug -> Windows -> Threads -> [ID column] 

如果我在Debug -> Windows -> Threads Ascending排序按這個ID我得到的順序線程開始了嗎?換言之:std::this_thread::get_id()是否始終隨着每個新線程的啓動而增加,或者它也可以遞減?

+0

線程標識可以重用,標準對標識的文本表示提出很少的要求。如果你只是在談論Windows以及在程序運行期間線程正在運行的情況,那麼我不確定。 – TartanLlama

回答

3

簡短回答:,線程ID不一定會隨每個新線程增加。線程ID可以重用。


的標準說

  1. 類型線程的一個目的:: ID提供每個 線程執行的,併爲所有線程的單個獨特的值的唯一標識符的對象 不代表一個執行線程(30.3.1)。 執行的每個線程都有一個關聯的線程:: id對象,它不等於任何其他執行線程的 線程:: id對象,而不是 等於任何std ::線程的線程:: id對象不是 的對象表示執行的線程。

  2. thread :: id應該是一個平凡的 可複製類(第9章)。該庫可以重新使用不能再被連接的已終止線程的線程::號的值。

- n4296; 30.3.1.1 [thread.thread.id]

這並不是說,該ID是單調遞增的,而且它確實許可證線程ID可以重複使用。

您很可能需要native_handle,它將成爲底層實現使用的句柄。這將對應於MSVC下的Windows線程句柄。這些是單調增加是你的實現文檔的一個問題。

GetCurrentThreadId函數的MSDN文檔建議線程ID唯一標識一個線程直到它終止;它並沒有說明ID是否單調遞增,並且該句子的含義似乎是它們可以被重用。

總之,C++標準沒有提供關於線程ID值的值的保證。如果你想保證這一點,你需要讓每個線程增加一個原子計數器,否則通過適當的同步獲得單調遞增的值。

+0

那麼有沒有可靠的方法,我怎麼才能確定哪個線程開始第一,第二,第三......? –

+0

總之:沒有。這個問題甚至可能沒有道理;考慮你開始一個額外的線程 - 你現在有兩個。每個線程開始另一個......哪一個首先開始?如果它們運行在不同的內核上,它們可以同時啓動(在OS線程層中模塊鎖定)。你究竟在努力實現什麼? – Andrew

+0

@WakanTanka你可以保留一個共享的原子計數器,它在每個線程的開始時遞增。但是,你應該概述你想要解決的問題。 – TartanLlama

0

答案是可能是。對於特定的實現,這是一個有用的調試啓發式(特別是如果線程句柄關閉)。另一方面,如果你想依靠它來保證程序的正確性,那麼這個標準顯然沒有這樣的保證,你需要以其他方式解決你的根本問題。

相關問題