2011-07-29 67 views
4

我想使用__thread存儲類將幾個變量定義爲線程特定的。但有三個問題讓我猶豫:在c99中使用__thread

  1. 它真的是c99的標準嗎?或者更重要的是,編譯器支持有多好?
  2. 變量是否會在每個線程中初始化?
  3. 非多線程程序是否將它們視爲純舊全局變量?
+2

只是作爲接收到的答案的插件,針對即將到來的標準C1x計劃線程本地存儲。 –

回答

5

爲了回答您的具體問題:

  1. 不,它不是C99的一部分。在n1256.pdf(C99 + TC1/2/3)或原始C99標準中,您不會發現它提及的任何地方。
  2. 是,__thread變量從每個新線程的初始化值開始。
  3. 從程序行爲的角度來看,線程本地存儲類變量的行爲與非多線程程序中的普通全局變量幾乎相同。但是,它們會產生更多的運行時成本(內存和啓動時間),並且可能會限制線程局部變量的大小和數量。所有這一切都比較複雜,取決於你的程序是否是static-或動態鏈接以及是否變量駐留在主程序或共享庫...實現C/POSIX的

外部(例如errno等等),在我看來,線程本地存儲類實際上並不是非常有用。這幾乎是一個柺杖,用於避免以上下文指針或類似形式乾淨地傳遞必要的狀態。你可能會認爲它可以用來解決像qsort這樣的不接受上下文指針的破壞接口,但不幸的是,不能保證qsort將在調用qsort的同一線程中調用比較函數。它可能會將作業分解並在多個線程中運行。大多數其他接口也可以採用這種解決方法。

+1

當然,線程本地數據總是有點破解,但這並不意味着你有時不需要破解。 –

+0

只想在這裏提到gnulib。它有一個線程本地存儲(tls)模塊,用於處理大多數平臺/編譯器。考慮一下,如果你正在寫(L)GPL軟件。如果沒有它,我不會開始編寫與平臺無關的代碼 - 節省您的使用壽命並減少頭痛。 – rockdaboot

+0

恩,gnulib不幫你編寫平臺無關的軟件。它可以幫助您編寫對某些* N *古怪平臺具有硬編碼平臺相關攻擊的軟件,除此之外別無它法。大多數這些黑客都不是線程安全的,並且也存在各種有問題的角落錯誤。 –

2

你可能想閱讀:

http://www.akkadia.org/drepper/tls.pdf

1)MSVC不支持C99。 GCC和其他編譯器嘗試GCC兼容性。

編輯的編譯器支持__thread細目可在這裏:

http://chtekk.longitekk.com/index.php?/archives/2011/02/C8.html

2)只有C++支持一個初始化並且它必須是恆定的。

3)非多線程應用程序是單線程應用程序。

+1

因此,對於(1),答案是'否;它不符合C99標準「。 –

+0

它在C99編輯中列爲存儲類說明符http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/C99-Thread_002dLocal-Edits.html –

+0

@ Steve-o:這並不意味着它與C99有什麼關係。相反,該文件只是顯示如何修改C99以包含'__thread'關鍵字。即將到來的C1x預計將包含線程本地存儲類,但它絕對不是C99的一部分。 –