繁体   English   中英

在C ++中是否可以初始化thread_local初始化?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM