4

C++11 标准包含一个新的添加 - thread_local 说明符 - 它使静态变量成为线程本地的。标准 thread_local 支持非平凡的类型 - 具有构造函数和析构函数的类型。不幸的是,GCC 通过__thread作为扩展提供的说明符仅支持普通类型。有没有办法thread_local在上面模拟__thread?的实现__thread非常快(相当于正则变量加两个间接),所以想避免热路径中的库函数。

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

4

1 回答 1

7

不。

gcc 目前没有能力在线程创建/销毁时为 __thread 运行 ctor/dtor,所以除非你不需要运行 ctor/dtor(在这种情况下 __thread 正是你需要的,并且没有什么可以在它上面模拟是必需的),还没有像 thread_local 那样工作的东西。

但是,如果您可以忍受延迟初始化(例如__thread T* ptr; if(!ptr){...}),您可以pthread_key_create在哪里注册一个销毁函数,该函数将在线程销毁时运行,然后您可以在那里注册所有指针。

或者您可以使用boost::thread_specific_ptrwhich 或多或少地执行此操作(可能不使用 __thread TLS 作为底层实现细节)

于 2012-08-21T21:42:32.813 回答