【问题标题】:Is there any way to fully emulate thread_local using GCC's __thread?有没有办法使用 GCC 的 __thread 完全模拟 thread_local?
【发布时间】:2012-08-17 06:48:00
【问题描述】:

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

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

【问题讨论】:

  • 当然。您可以存储 __thread 指针而不是对象,但我认为这不是您想要的。

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


【解决方案1】:

没有。

gcc 目前无法在线程创建/销毁时为 __thread 运行 ctor/dtor,因此除非您不需要运行 ctor/dtor(在这种情况下 __thread 正是您所需要的,没有什么可以模拟的)最重要的是需要),目前还没有像 thread_local 这样的东西。

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

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

【讨论】:

  • 延迟初始化对我来说已经足够了,因此您的“hack”完美地解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-13
  • 2020-02-28
  • 2023-04-03
  • 1970-01-01
相关资源
最近更新 更多