g ++ __thread =非平凡的构造函数

时间:2012-02-05 10:53:36

标签: c++ multithreading gcc g++

我想在g ++中使用__thread修饰符作为C ++ 11中thread_local的替换。不幸的是,我的本地线程变量没有简单的构造函数(它必须设置一个整数组件的值)。 我想考虑使用这种结构:

__thread MyVariable *var;

__thread MyVariable* MyClass::var = nullptr;

每当我想获得var的访问时,我会检查是否已分配:

if(var == nullptr)
   var = new MyVariable(42);

但我不知道,如何以这种方式释放内存。

2 个答案:

答案 0 :(得分:2)

__thread存储说明符无法处理具有非平凡构造函数和析构函数的对象。

对于具有非平凡构造函数和析构函数的对象,您可能希望使用boost::thread_specfic_ptr<>。当线程终止boost::thread_specfic_ptr<>时,在相应的特定于线程的对象上调用delete

答案 1 :(得分:1)

我编写了一个小的演示程序来演示如何定义一个与非平凡类型一起工作的thread_local宏,并以__thread持续时间存储所有内容。它优于boost :: thread_specific_ptr,因为它不进行任何动态内存分配。

请参阅我对这个问题的回答:

gcc 4.7 on linux pthreads - nontrivial thread_local workaround using __thread (no boost)