在C ++中是否可以进行早先的thread_local初始化?

时间:2018-10-11 12:48:05

标签: c++ initialization lazy-initialization thread-local static-initialization

[basic.stc.thread]指出:“具有线程存储持续时间的变量应在首次使用(6.2)之前初始化,如果构造,则应在线程退出时销毁。 “

这是否排除了在创建线程时急于初始化名称空间范围thread_local变量的实现,并且是否有任何主要的编译器支持通过某种注释强制执行此操作的任何机制?

我有非常少量的对性能至关重要的__thread变量,我希望避免thread_local通常会发生的每次访问的惰性初始化检查,但是我目前需要进行设置/通过单独的调用进行拆解,以使其不受非琐碎的析构函数的限制,从而不受__thread的限制。我是否可以保证每个线程都渴望构建/销毁thread_local,并且无需进行惰性初始化测试?

如果失败了,处理__thread设置/拆卸呼叫注册的最干净的已知模式是什么?

1 个答案:

答案 0 :(得分:0)

  

我可以为thread_local保证每个线程都能够进行急切的构造/销毁并且没有惰性的init测试吗?

不太可能。

  

如果失败了,处理__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
}