簡體   English   中英

在c99中使用__thread

[英]Using __thread in c99

我想使用__thread存儲類將一些變量定義為特定於線程的。 但是三個問題讓我猶豫不決:

  1. 這是c99的標准配置嗎? 或者更重要的是,編譯器支持有多好?
  2. 變量是否會在每個線程中初始化?
  3. 非多線程程序是否將它們視為普通的全局變量?

回答您的具體問題:

  1. 不,它不是C99的一部分。 您不會在n1256.pdf(C99 + TC1 / 2/3)或原始C99標准中的任何地方找到它。
  2. 是的, __thread thread變量以每個新線程中的初始值開始。
  3. 從程序行為的角度來看,線程局部存儲類變量的行為與非多線程程序中的普通全局變量幾乎相同。 但是,它們會產生更多的運行時成本(內存和啟動時間),並且可能存在線程局部變量的大小和數量限制的問題。 所有這些都相當復雜,取決於您的程序是靜態鏈接還是動態鏈接以及變量是駐留在主程序還是共享庫中...

在實現C / POSIX之外(例如errno等),在我看來,線程局部存儲類實際上並不是非常有用。 它幾乎是一個避免以上下文指針或類似形式干凈地繞過必要狀態的拐杖。 您可能認為繞過像qsort這樣不帶上下文指針的破壞接口可能很有用,但不幸的是,不能保證qsort會在調用qsort的同一個線程中調用比較函數。 它可能會破壞作業並在多個線程中運行它。 對於大多數其他可以采用這種解決方法的接口也是如此。

你可能想讀這個:

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)非多線程應用程序是單線程應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM