C++コンパイラはC++0xでスレッドローカルストレージをどのように実装するのか
これを Google で検索しました。しかし、これについては何も見つかりません。
これについて何か資料を持っている人はいますか?
ベストアンサー1
読んでみてくださいWikipedia のエントリ。
スレッドローカル ストレージは、C++ に特有のものではありません。「TLS」(スレッドローカル ストレージの略) や「スレッド固有ストレージ」(TSS) など、別の名前で呼ばれることもあります。
ほとんどのオペレーティングシステムは、スレッドごとのストレージにアクセスするためのAPIを提供しています。たとえば、WindowsにはAPI関数の束TLSで始まる。内部的には、Win32はスレッドごとのさまざまなデータのための特別な領域を予約している。これには、特定のCPUレジスタ(x86ではFS)を介してアクセスできる、ユーザースレッドローカルストレージが含まれる。Linuxは、次のような名前のpthread APIを通じてスレッド固有のストレージを提供する。pthread_key_createこれらは通常、同様の手法を使用して実装されます。
OS がまったくサポートを提供しない可能性もあります。ただし、OS が API を通じてプロセス固有のスレッド ID を提供する場合、C++ ランタイム ライブラリは概念的に のようなものをstd::map<thread_id, per_thread_storage>
内部的に維持できます。もちろん、何がper_thread_storage
であるかという問題があります。プログラムが静的にリンクされている場合、プログラムで要素として宣言されたすべてのスレッド ローカル ストレージ変数を含む大きな構造体へのポインタのようなものになる可能性があります。これは単純化しすぎですが、大まかな考え方は理解できます。
スレッド ローカル ストレージ変数へのアクセスは、当然のことながら、単純なメモリの読み取りや書き込みではありません。それよりもかなり複雑な可能性があります。特定の関数でスレッド ローカル/特定のストレージを頻繁に使用する場合は、まずスレッド ローカル ストレージ ポインターをローカル変数にコピーすることをお勧めします。