C ++编译器错误“不能是线程本地的,因为它具有非POD类型”“

时间:2012-11-29 18:08:52

标签: c++ multithreading

本声明:

___thread A a;

生成此错误:

  

不能是线程本地的,因为它具有非POD类型

其中A是

class A{
       public:
               // function declaration
       private:
               // data members
};

我正在尝试在Linux上编译,使用命令ogs includes& ogs mk。 我们有静态线程,即在我们的应用程序进入之前我们知道线程的数量,因此当前解决了A数组的工作。

A a[Number of threads].

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

假设您使用gcc,线程本地存储仅支持POD类型,即仅数据结构。 您可以尝试将数据提取到单独的struct中并使其成为本地线程(实际上,这在任何情况下都可能是一个好主意,因为在使方法线程本地时没有多大意义)。

答案 1 :(得分:1)

不幸的是,在C ++ 03中没有线程本地资源的动态初始化(和销毁)这一点(无论如何都对线程一无所知)。

在C ++ 11中,thread_local storage关键字允许以运行时开销为代价进行动态初始化(基本上,相当于具有线程本地静态变量),因此可以在没有构造函数的类型的情况下使用。 / p>

在C ++ 11中,同样,constexpr构造函数可能会调用静态初始化,因此应该与__thread说明符兼容,前提是编译器实现它。