2011-08-12 85 views
14

我讀到C++中有一個新的關鍵字:它是我讀過的__thread在C++中使用__thread 0x

我只知道它是一個關鍵字,就像static關鍵字一樣使用,但我什麼也不知道。這是否只是關鍵字意味着,例如,如果一個變量被宣佈像這樣:

__thread int foo; 

那麼任何與該變量將與一個新的線程來執行?

+0

你從哪裏讀到的? –

回答

21

這是thread_local,而不是__thread。它用於定義具有線程存儲持續時間的變量。

thread_local新的在C++ 0x中添加了存儲持續時間說明符。還有其他的存儲持續時間:靜態自動動態

this link

線程本地存儲持續時間(C++ 11功能)。變量在線程開始時分配,線程結束時釋放。每個線程都有自己的變量實例。只有聲明thread_local的變量才具有這個存儲持續時間。


我認爲引入這種關鍵字的通過引入在C語言的標準存儲器模型成爲可能++ 0x中:

+0

whoa,答案看起來與3分鐘前完全不同。 –

+0

@Mooing:現在確實如此。 – Nawaz

+0

「'thread_local'是在C++ 03中添加的一個新的存儲持續時間說明符」:這是什麼廢話? –

5

該關鍵字被稱爲thread_local。這意味着每個線程都有自己的那個變量版本。

2

否,但它確實不表示「與該變量有關的任何內容都將使用新線程執行」。這意味着每個存在的線程都會有一個變量副本,每個線程只能看到它自己的變量副本。

+1

在C++ 0x/11中沒有關鍵字叫做__thread。 –

19

the Wikipedia article on "Thread-local storage"

線程本地存儲(TLS)是使用 靜態或全局內存線程局部計算機編程方法。

這有時需要的,因爲通常在過程的所有線程 共享相同的地址空間,這是不希望有時。

和:

的C++ 0x引入了thread_local關鍵字。除此之外的是,各種C++ 編譯器實現提供具體的方式來聲明線程局部 變量:

的Sun Studio C/C++,IBM XL C/C++,GNU C和Intel C/C++(Linux系統)使用的語法:

__thread int number; 

的Visual C++,英特爾C/C++(Windows系統),用Borland C++ Builder和數字火星C++使用語法:

__declspec(thread) int number; 

的Borland C++ Builder還支持語法:

int __thread number; 

所以,雖然__thread確實在實踐中存在,在某些系統上,thread_local是新的,正式的,C++ 0x中的關鍵字,做同樣的事情。

只要您有權訪問C++ 0x,就可以使用非標準__thread