1. ホーム
  2. c++

[解決済み] C++11のthread_local変数は自動的にstaticになりますか?

2023-01-26 19:36:39

質問

この2つのコードセグメントに違いはありますか?

void f() {
    thread_local vector<int> V;
    V.clear();
    ... // use V as a temporary variable
}

void f() {
    static thread_local vector<int> V;
    V.clear();
    ... // use V as a temporary variable
}

背景:もともと私は静的ベクトルV(中間値を保持するためのもので、関数に入るたびにクリアされる)とシングルスレッド・プログラムを持っていました。このプログラムをマルチスレッドにしたいので、どうにかしてこのstatic修飾子を取り除かなければなりません。私の考えは、すべてのstaticをthread_localに変えて、他のことは気にしないようにすることですか?このアプローチは裏目に出ることがありますか?

どのように解決するのですか?

C++標準によると

thread_local がブロックスコープの変数に適用された場合、その変数には ストレージクラス指定子 static が暗示されます。 と表示されない場合は 明示的に

ということは、この定義が

void f() {
    thread_local vector<int> V;
    V.clear();
    ... // use V as a temporary variable
}

void f() {
    static thread_local vector<int> V;
    V.clear();
    ... // use V as a temporary variable
}

ただし、静的変数が ではなく thread_local 変数と同じです。

1 thread_local キーワードで宣言されたすべての変数は、スレッド記憶期間を持ちます。 ストレージの持続時間を持つ。これらの実体のためのストレージは、それらが作成されたスレッドの持続時間の間 これらの実体のためのストレージは、それらが作成されたスレッドの期間続くものとする。スレッドごとに個別の オブジェクトまたは参照はスレッドごとに存在し、宣言された名前の使用は、現在のスレッドに関連する実体を参照する。 現在のスレッドに関連付けられた実体を指す。

これらの変数を区別するために、この規格は新しい用語を導入しています。 スレッド保存期間 を静的な保存期間と一緒に使用します。