2

gcc 4.8.0 thread_localでは、C++11 標準からの実装が追加されました。変更は、「実行時にペナルティ」が発生する可能性があると述べています。

G++ は C++11thread_localキーワードを実装するようになりました。[...] 残念ながら、このサポートでは、動的な初期化が必要ない場合でも、別の翻訳単位で定義された非関数ローカル変数への参照に対して実行時のペナルティがthread_local必要です [...]。

非定義 TU での変数の使用が動的初期化をトリガーする必要がないことをプログラマーが確信できる場合 (変数が静的に初期化されるか、定義 TU での変数の使用が別の TU での使用の前に実行されるため) TU)、-fno-extern-tls-init オプションを使用してこのオーバーヘッドを回避できます。

thread_localG++ がグローバル変数に対して何をするのか、誰か説明してもらえますか?

  • 一般的なメカニズムは何ですか?
  • 何がオーバーヘッドを誘発しますか?
  • アクセスあたりのオーバーヘッドはどのくらいですか? ポインタの間接化?高価なロック?
  • 正確には、どのような状況でオーバーヘッドが発生しませんか?

変更メモから、たとえば、これにはオーバーヘッドがないと仮定します。

thread_local Data data { 1000 };

void worker() {
    for(auto &elem : data)
        elem.calulcate();
}

data同じ翻訳単位にあるからですか?

workerdataが異なる翻訳単位にある場合、これはどのように変化しますか? これはその例ですか?

// 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();
}

datainを使用workerするとオーバーヘッドが発生しますか? それがstartキックオフだったとしても、まだそうworkerですか?

4

0 に答える 0