2015-09-28 76 views
7

從我的經驗,似乎的std :: thread :: id跨進程唯一嗎?

std::this_thread::get_id() 

結果是在工藝獨特:ID是從一個過程到另一個不同。

這是由標準保證的嗎?

+0

你現在要求專門爲linux上的gcc還是一般的C++?答案似乎不同。 – nwp

+0

我的問題是關於一般的C++標準。我正在尋找所有平臺和所有編譯器的答案。 –

+5

該標準沒有任何「過程」的概念,任何幾個程序可能同時運行和交互的概念。所以這個問題甚至不能用標準的術語來表達,更不用說回答了。所有你可以問的是「典型的實現會做什麼?」 –

回答

1

std :: thread是在支持pthread的環境中的pthreads之上實現的。所以它成爲沒有(便攜式)保證。

pthread_self手冊:

線程ID被保證只有內的進程是唯一的。 A
線程ID可能在已加入終止的線程後重新使用,或者分離的線程已終止 。

+3

這並不回答C++標準要求的問題,它只是意味着如果C++標準要求線程ID在進程間是唯一的,那麼實現不能簡單地重用pthread ID。 (但它確實使得C++標準可能不需要線程ID在整個進程中是唯一的。) – hvd

+0

@ hvd是的,但std :: thread是在支持pthread的環境中的pthread上實現的。所以它成爲沒有(便攜式)保證。 – PSIAlt

+2

你可以添加一個'std :: thread'在pthreads的頂部實現的clam的源代碼嗎?我無法想象這個標準。我也相當肯定Windows是一個反例,因爲pthreads可用並且不用於實現'std :: thread',它們都使用本地WinApi實現。但是,微軟並不是第一次不符合標準。 – nwp

2

標準受贈該線程ID在不同的線程獨特的,它也表示,終止線程ID可能被重用。它沒有指定進程,也沒有確認它們的存在,因此,它不能保證跨進程的唯一性。

30.3.1.1

  1. 類型線程的一個目的:: ID提供用於執行的每個線程併爲所有線程的單個獨特的值的唯一標識符的對象 不表示執行的線程(30.3.1)。 執行的每個線程都有一個關聯的線程:: id對象,它不等於任何其他執行線程的 線程:: id對象,而不是 等於任何std ::線程的線程:: id對象不是 的對象表示執行的線程。
  2. thread :: id應該是一個可以複製的類(第9章)。該庫可以重用不能再被連接的已終止線程 的線程:: id的值。

該標準還隱藏了一個線程::標識的實施,它可能是一個int或別的東西。

相關問題