C++11 标准包含一个新的添加 - thread_local 说明符 - 它使静态变量成为线程本地的。标准 thread_local 支持非平凡的类型 - 具有构造函数和析构函数的类型。不幸的是,GCC 通过__thread
作为扩展提供的说明符仅支持普通类型。有没有办法thread_local
在上面模拟__thread
?的实现__thread
非常快(相当于正则变量加两个间接),所以想避免热路径中的库函数。
我正在使用 GCC 和 Linux。不需要便携性。
C++11 标准包含一个新的添加 - thread_local 说明符 - 它使静态变量成为线程本地的。标准 thread_local 支持非平凡的类型 - 具有构造函数和析构函数的类型。不幸的是,GCC 通过__thread
作为扩展提供的说明符仅支持普通类型。有没有办法thread_local
在上面模拟__thread
?的实现__thread
非常快(相当于正则变量加两个间接),所以想避免热路径中的库函数。
我正在使用 GCC 和 Linux。不需要便携性。
不。
gcc 目前没有能力在线程创建/销毁时为 __thread 运行 ctor/dtor,所以除非你不需要运行 ctor/dtor(在这种情况下 __thread 正是你需要的,并且没有什么可以在它上面模拟是必需的),还没有像 thread_local 那样工作的东西。
但是,如果您可以忍受延迟初始化(例如__thread T* ptr; if(!ptr){...}
),您可以pthread_key_create
在哪里注册一个销毁函数,该函数将在线程销毁时运行,然后您可以在那里注册所有指针。
或者您可以使用boost::thread_specific_ptr
which 或多或少地执行此操作(可能不使用 __thread TLS 作为底层实现细节)