我希望将C++ 11 thread_local关键字用于每线程布尔标志,该标志将非常频繁地访问.
但是,大多数编译器似乎都使用一个表来实现线程本地存储,该表将整数ID(槽)映射到当前线程上的变量地址.此查找将在性能关键的代码路径中发生,因此我对其性能有一些担忧.
我希望实现线程本地存储的方式是通过分配由不同物理页面支持的虚拟内存范围,具体取决于线程.这样,访问该标志将与任何其他存储器访问的成本相同,因为MMU负责映射.
为什么没有一个主流编译器以这种方式利用页表映射?
我想我可以mmap在Linux和VirtualAllocWin32 上实现我自己的"特定于线程的页面" ,但这似乎是一个非常常见的用例.如果有人知道现有或更好的解决方案,请指出他们.
我还考虑std::atomic<std::thread::id>在每个对象中存储一个代表活动线程,但是分析显示检查std::this_thread::get_id() == active_thread非常昂贵.