我想使用__thread存儲類將幾個變量定義爲線程特定的。但有三個問題讓我猶豫:在c99中使用__thread
- 它真的是c99的標準嗎?或者更重要的是,編譯器支持有多好?
- 變量是否會在每個線程中初始化?
- 非多線程程序是否將它們視爲純舊全局變量?
我想使用__thread存儲類將幾個變量定義爲線程特定的。但有三個問題讓我猶豫:在c99中使用__thread
爲了回答您的具體問題:
__thread
變量從每個新線程的初始化值開始。外部(例如errno
等等),在我看來,線程本地存儲類實際上並不是非常有用。這幾乎是一個柺杖,用於避免以上下文指針或類似形式乾淨地傳遞必要的狀態。你可能會認爲它可以用來解決像qsort
這樣的不接受上下文指針的破壞接口,但不幸的是,不能保證qsort
將在調用qsort
的同一線程中調用比較函數。它可能會將作業分解並在多個線程中運行。大多數其他接口也可以採用這種解決方法。
當然,線程本地數據總是有點破解,但這並不意味着你有時不需要破解。 –
只想在這裏提到gnulib。它有一個線程本地存儲(tls)模塊,用於處理大多數平臺/編譯器。考慮一下,如果你正在寫(L)GPL軟件。如果沒有它,我不會開始編寫與平臺無關的代碼 - 節省您的使用壽命並減少頭痛。 – rockdaboot
恩,gnulib不幫你編寫平臺無關的軟件。它可以幫助您編寫對某些* N *古怪平臺具有硬編碼平臺相關攻擊的軟件,除此之外別無它法。大多數這些黑客都不是線程安全的,並且也存在各種有問題的角落錯誤。 –
你可能想閱讀:
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),答案是'否;它不符合C99標準「。 –
它在C99編輯中列爲存儲類說明符http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/C99-Thread_002dLocal-Edits.html –
@ Steve-o:這並不意味着它與C99有什麼關係。相反,該文件只是顯示如何修改C99以包含'__thread'關鍵字。即將到來的C1x預計將包含線程本地存儲類,但它絕對不是C99的一部分。 –
只是作爲接收到的答案的插件,針對即將到來的標準C1x計劃線程本地存儲。 –