C++11の の説明に困惑していますthread_local
。私の理解では、各スレッドは関数内のローカル変数の一意のコピーを持っています。グローバル/静的変数はすべてのスレッドからアクセスできます (ロックを使用した同期アクセスの可能性があります)。また、変数はすべてthread_local
のスレッドから参照できますが、定義されているスレッドによってのみ変更できますか? これは正しいですか?
ベストアンサー1
スレッドローカルストレージ期間は、一見グローバルまたは静的ストレージの存続期間(それを使用する関数の観点から)ですが、実際には、糸。
現在のオプションに追加されます:
- 自動(ブロックまたは関数の実行中に存在します)
- 静的(プログラム期間中存在する)
- 動的 (割り当てと解放の間のヒープ上に存在します)。
スレッドローカルなものは、スレッドの作成時に作成され、スレッドが終了すると破棄されます。
たとえば、シードをスレッドごとに維持する必要がある乱数ジェネレーターを考えてみましょう。スレッドローカル シードを使用するということは、各スレッドが他のすべてのスレッドから独立して独自の乱数シーケンスを取得することを意味します。
シードがランダム関数内のローカル変数である場合、呼び出されるたびに初期化され、毎回同じ数値が与えられます。グローバルである場合、スレッドは互いのシーケンスに干渉します。
もう 1 つの例は、strtok
トークン化の状態がスレッドごとに保存されるような場合です。こうすることで、単一のスレッドは、他のスレッドがトークン化の作業を台無しにしないことを確信しながら、複数の呼び出しにわたって状態を維持できるようになります。strtok
これにより、基本的にstrtok_r
(スレッドセーフ バージョンは) 冗長になります。
まだ別の例は、次のようになります。呼び出しの 1 つが失敗した後、結果を確認する前に、errno
別のスレッドで変更が行われることは望ましくありません。errno
このページさまざまな保存期間指定子について適切な説明があります。