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