gcc 4.8.0 thread_local
では、C++11 標準からの実装が追加されました。変更は、「実行時にペナルティ」が発生する可能性があると述べています。
G++ は C++11
thread_local
キーワードを実装するようになりました。[...] 残念ながら、このサポートでは、動的な初期化が必要ない場合でも、別の翻訳単位で定義された非関数ローカル変数への参照に対して実行時のペナルティがthread_local
必要です [...]。非定義 TU での変数の使用が動的初期化をトリガーする必要がないことをプログラマーが確信できる場合 (変数が静的に初期化されるか、定義 TU での変数の使用が別の TU での使用の前に実行されるため) TU)、-fno-extern-tls-init オプションを使用してこのオーバーヘッドを回避できます。
thread_local
G++ がグローバル変数に対して何をするのか、誰か説明してもらえますか?
- 一般的なメカニズムは何ですか?
- 何がオーバーヘッドを誘発しますか?
- アクセスあたりのオーバーヘッドはどのくらいですか? ポインタの間接化?高価なロック?
- 正確には、どのような状況でオーバーヘッドが発生しませんか?
変更メモから、たとえば、これにはオーバーヘッドがないと仮定します。
thread_local Data data { 1000 };
void worker() {
for(auto &elem : data)
elem.calulcate();
}
data
同じ翻訳単位にあるからですか?
worker
とdata
が異なる翻訳単位にある場合、これはどのように変化しますか? これはその例ですか?
// module.cpp
void worker();
thread_local Data data { 1000 };
void start() {
worker();
}
// main.cpp
extern thread_local Data data; // correct decl?
void worker() {
for(auto &elem : data)
elem.calulcate();
}
data
inを使用worker
するとオーバーヘッドが発生しますか? それがstart
キックオフだったとしても、まだそうworker
ですか?