C 11 のスレッドローカル変数: 自動的に静的?
C 11 では、thread_local 変数は、データを管理するための強力なメカニズムです。実行中の各スレッドに固有です。ただし、よくある質問は、それらは自動的に静的として扱われるのかということです。これに答えるために、2 つのコード セグメントを調べてみましょう:
コード セグメント 1
<code class="cpp">void f() { thread_local vector<int> V; V.clear(); ... // use V as a temporary variable }</code>
コード セグメント 2
<code class="cpp">void f() { static thread_local vector<int> V; V.clear(); ... // use V as a temporary variable }</code>
C 標準は明確な答えを提供します:
標準によると:
thread_local がブロック スコープの変数に適用される場合、storage-class-specifier static は、明示的に表示されない場合は暗黙的に指定されます。
したがって、コード セグメント 1 はコード セグメント 2 と同等です。 ただし、これは、thread_local 変数と static 変数が交換可能であることを意味するわけではありません。
スレッドローカル変数と静的変数
スレッドローカル変数は静的ストレージを意味しますが、静的変数とは根本的な違いがあります。
すべての変数は、 thread_local キーワードには、_スレッド保存期間_があります。これらのエンティティのストレージは、エンティティが作成されたスレッドの間存続します。スレッドごとに個別のオブジェクトまたは参照があり、宣言された名前の使用は、現在のスレッドに関連付けられたエンティティを参照します。
本質的に、スレッド ストレージ期間 により、各スレッドのthread_local 変数の独自のインスタンス。これは、プロセス内のすべてのスレッド間で共有される静的変数とは対照的です。
マルチスレッドの影響
元の質問が示唆しているように、thread_local 変数を使用して置き換えることができます。マルチスレッド プログラムの静的変数を使用して、潜在的な競合状態やデータ競合を排除します。ただし、thread_local 変数はスレッド間で共有されないので、スレッド固有のデータが必要な場合にのみ使用する必要があることを覚えておくことが重要です。
以上がC 11 のスレッドローカル変数は自動的に静的変数として扱われますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。