C++11 の thread_local はどういう意味ですか? 質問する

C++11 の thread_local はどういう意味ですか? 質問する

C++11の の説明に困惑していますthread_local。私の理解では、各スレッドは関数内のローカル変数の一意のコピーを持っています。グローバル/静的変数はすべてのスレッドからアクセスできます (ロックを使用した同期アクセスの可能性があります)。また、変数はすべてthread_localのスレッドから参照できますが、定義されているスレッドによってのみ変更できますか? これは正しいですか?

ベストアンサー1

スレッドローカルストレージ期間は、一見グローバルまたは静的ストレージの存続期間(それを使用する関数の観点から)ですが、実際には、糸。

現在のオプションに追加されます:

  • 自動(ブロックまたは関数の実行中に存在します)
  • 静的(プログラム期間中存在する)
  • 動的 (割り当てと解放の間のヒープ上に存在します)。

スレッドローカルなものは、スレッドの作成時に作成され、スレッドが終了すると破棄されます。


たとえば、シードをスレッドごとに維持する必要がある乱数ジェネレーターを考えてみましょう。スレッドローカル シードを使用するということは、各スレッドが他のすべてのスレッドから独立して独自の乱数シーケンスを取得することを意味します。

シードがランダム関数内のローカル変数である場合、呼び出されるたびに初期化され、毎回同じ数値が与えられます。グローバルである場合、スレッドは互いのシーケンスに干渉します。


もう 1 つの例は、strtokトークン化の状態がスレッドごとに保存されるような場合です。こうすることで、単一のスレッドは、他のスレッドがトークン化の作業を台無しにしないことを確信しながら、複数の呼び出しにわたって状態を維持できるようになります。strtokこれにより、基本的にstrtok_r(スレッドセーフ バージョンは) 冗長になります。


まだ別の例は、次のようになります。呼び出しの 1 つが失敗した後、結果を確認する前に、errno別のスレッドで変更が行われることは望ましくありません。errno


このページさまざまな保存期間指定子について適切な説明があります。

おすすめ記事