3

スレッド ローカル ストレージを利用する C++ コードがいくつかあります。各スレッドには、データをプッシュできるベクトルがあります。

TLS を使用してスレッドごとにインデックス ID を保存します。これを使用して、データをプッシュするベクトルを検索できます。次に、データをベクターにプッシュするかなりの量のコードを実行します。

私が疑問に思っているのは、OS がスレッド ローカル オブジェクトへのポインターを取得した後、別のスレッドで実行するようにコードを再スケジュールする可能性があるかどうかです。(これまでのところ、コードは正常に実行されますが、これが発生したことはありません)。しかし、2 つのスレッドが同じオブジェクトを持つことが可能になるため、これが可能であるとすれば、私のプログラムが壊れることは間違いないようです。

これが真実であると仮定すると、複雑な TLS を使用するコードでも問題になるように思われますが、TLS はアドレスを取得しない単純なオブジェクトのみを対象としていますか?

ありがとう!

4

2 に答える 2

3

スレッドローカルストレージはまさにそれです-スレッドごとのストレージ。各スレッドには、独自のプライベートデータ構造があります。そのスレッドは、どのプロセッサで実行されていても、同じスレッドです。OSはスレッド内での作業をスケジュールせず、どのスレッドを実行するかをスケジュールします。

スレッドローカルストレージは、スレッド自体とともに変更されるある種の間接参照を持つことによって実現されます。これを行うにはいくつかの方法があります。たとえば、OSのプロセスの仮想メモリの開始から特定のオフセットに特定のページがあり、スレッドがスケジュールされると、ページテーブルがスレッドに一致するように更新されます。

x86プロセッサでは、通常、FSまたはGSが「スレッドごとの」データに使用されるため、OSはFSレジスタ[または64ビットプロセッサの場合はレジスタのベースアドレスの内容]を切り替えます。TLSを読み取るとき、コンパイラはFSまたはGSセグメントレジスタを使用してメモリの読み取り/書き込み操作のプレフィックスを付けるため、他のスレッドではなく、常に「プライベートデータ」を取得します。

もちろん、OSにはバグがあるかもしれませんが、これはかなりの数の問題に依存するものなので、壊れた場合はすぐに表示されます(非常に微妙で、適切な場所に立っている必要があります。正しい段階の月、正しい色の服を着ている、正しい方向の風、3と7の両方で分割可能な日付など)。

于 2013-01-24T11:48:38.163 に答える
2

TLS はスレッドローカルを意味します。説明から、各スレッドは TLS を介してベクトルの共有ベクトルにアクセスします(よくわかりません)。何らかのロックを使用する必要があります。サンプルコードはありますか?

于 2013-01-24T11:47:24.553 に答える