有没有办法使用GCC的__thread完全模拟thread_local?

时间:2012-08-21 21:08:45

标签: c++ gcc c++11 thread-local

C ++ 11标准包含一个新增的 - thread_local说明符 - 它使静态变量成为线程局部的。标准的thread_local支持非平凡类型 - 具有构造函数和析构函数的类型。遗憾的是,GCC仅通过__thread说明符作为扩展名来支持普通类型。有没有办法在thread_local之上模仿__thread__thread的实现非常快(相当于常规变量加上两个间接),所以我想避免热路径中的库函数。

我正在使用GCC和Linux。不需要携带。

1 个答案:

答案 0 :(得分:7)

没有

gcc当前没有能力在线程创建/销毁时为__thread运行ctor / dtor,所以除非你不需要运行ctor / dtor(在这种情况下,__thread正是你需要的,没有什么可以模仿的它的顶部是必需的),还没有什么能像thread_local一样工作。

但是如果您可以使用延迟初始化(例如__thread T* ptr; if(!ptr){...}),您可以与pthread_key_create一起破解某些内容,您可以在其中注册将在线程销毁时运行的销毁函数,然后您可以注册所有指针都在那里。

或者您可以使用boost::thread_specific_ptr或多或少这样做(可能不使用__thread TLS作为底层实现细节)