thread_local
非常に頻繁にアクセスされるスレッドごとのブール値フラグにC++11 キーワードを使用したいと考えていました。
ただし、ほとんどのコンパイラは、整数 ID (スロット) を現在のスレッドの変数のアドレスにマップするテーブルを使用して、スレッド ローカル ストレージを実装しているようです。このルックアップは、パフォーマンスが重要なコード パス内で発生するため、そのパフォーマンスについて懸念があります。
スレッド ローカル ストレージが実装されることを期待していた方法は、スレッドに応じて異なる物理ページによってサポートされる仮想メモリ範囲を割り当てることです。そうすれば、フラグへのアクセスは、MMU がマッピングを処理するため、他のメモリ アクセスと同じコストになります。
主流のコンパイラのどれも、このようにページ テーブル マッピングを利用しないのはなぜですか?
mmap
Linux とVirtualAlloc
Win32 で独自の「スレッド固有のページ」を実装できると思いますが、これはかなり一般的な使用例のようです。誰かが既存の解決策またはより良い解決策を知っている場合は、それらを教えてください。
std::atomic<std::thread::id>
また、アクティブなスレッドを表すために各オブジェクト内に を格納することも検討しましたが、プロファイルを作成すると、チェックstd::this_thread::get_id() == active_thread
が非常に高価であることがわかります。