[英]Is eager thread_local initialization possible in C++?
[basic.stc.thread]声明“具有线程存储持续时间的变量应在其第一次使用odr之前初始化(6.2),如果构造,则应在线程退出时销毁。”
这是否排除了在创建线程时急切地初始化命名空间范围的thread_local
变量的实现,并且是否有任何主要的编译器支持通过某些注释强制执行此操作的任何机制?
我有一个非常少的性能关键的__thread
变量我想要保持不受thread_local
通常会发生的每次访问的延迟初始化检查,但我目前需要通过单独的调用进行设置/拆卸以保持在__thread
限制内关于非平凡的析构函数等。我可以获得thread_local
,保证每个线程都需要构建/销毁,并且不进行延迟初始化测试吗?
如果做不到这一点,处理__thread
设置/拆除呼叫注册的最清晰的已知模式是什么?
我可以为每个线程获得有保证的急切构造/销毁的
thread_local
并且没有懒惰的初始化测试吗?
不太可能。
如果做不到这一点,处理
__thread
设置/拆除呼叫注册的最清晰的已知模式是什么?
您可以将所有特定于线程的信息打包到一个通过一个特定于线程的指针访问的对象中,该指针在线程启动时初始化。 例如:
struct ThreadContext {
thread_local static ThreadContext* instance;
ThreadContext() {
assert(!instance);
instance = this;
}
~ThreadContext() {
instance = 0;
}
ThreadContext(ThreadContext const&) = delete;
ThreadContext& operator=(ThreadContext const&) = delete;
};
thread_local ThreadContext* ThreadContext::instance = 0;
void thread_function() {
ThreadContext context;
// Access it elsewhere as:
ThreadContext::instance;
}
ThreadContext* getThisThreadContext() {
return ThreadContext::instance;
// No init check here. Just one move:
// mov rax, QWORD PTR fs:ThreadContext::instance@tpoff
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.