webdevqa.jp.net

Linuxスレッドローカルストレージの実装

__thread Foo foo;

「foo」は実際にどのように解決されますか?コンパイラは「foo」のすべてのインスタンスを関数呼び出しでサイレントに置き換えますか? 「foo」はスタックの最下部を基準にしてどこかに格納され、コンパイラはこれを「ねえ、スレッドごとに、このスペースをスタックの最下部近くに置き、fooは「スタックの最下部からのオフセットx」として格納されます。 「?

30
anon

少し複雑ですが( このドキュメント 詳細に説明されています)、基本的にはどちらでもありません。代わりに、コンパイラは、すべてのスレッドローカル変数を含む特別な.tdataセクションを実行可能ファイルに配置します。実行時に、各スレッドの新しいデータセクションが(読み取り専用).tdataセクションのデータのコピーで作成され、実行時にスレッドが切り替えられると、セクションも自動的に切り替えられます。

最終的な結果として、__ thread変数は通常の変数と同じくらい高速であり、余分なスタックスペースも占有しません。

34
Dean Harding