C++ C++;编译器错误";不能是线程本地,因为它具有非POD类型”&引用;

C++ C++;编译器错误";不能是线程本地,因为它具有非POD类型”&引用;,c++,multithreading,C++,Multithreading,本声明: ___thread A a; 生成此错误: 不能是线程本地,因为它具有非POD类型 A在哪里 class A{ public: // function declaration private: // data members }; 我正在尝试在Linux上使用命令ogs includes&ogs mk进行编译。 我们有静态线程,也就是说,在我们的应用程序进入之前,我们知道线程的数量,因此目前的解

本声明:

___thread A a;
生成此错误:

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

A在哪里

class A{
       public:
               // function declaration
       private:
               // data members
};
我正在尝试在Linux上使用命令ogs includes&ogs mk进行编译。 我们有静态线程,也就是说,在我们的应用程序进入之前,我们知道线程的数量,因此目前的解决方法是声明一个静态线程的数组

A a[Number of threads].

如何修复此问题?

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

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

在C++11中,
thread\u local
storage关键字允许以运行时开销为代价进行动态初始化(基本上相当于有一个thread-local静态变量),因此可以在没有带构造函数的类型的情况下使用


同样,在C++11中,
constepr
构造函数可能会被调用进行静态初始化,因此应该与
\uu线程
说明符兼容,前提是编译器实现了它。

请注意,您可以将所有数据成员
设为私有
,并将这些方法放在单独的
friend
类中。谢谢icepack、 但是,我没有访问类A模板的权限,因此我无法将类A更改为结构A。类A已经被大量使用,因此我需要避免对类A进行尽可能多的更改。我们认为另一个解决方法是在全局头文件declare u thread A*A中;在thread init函数中have A=new A()但是现在我们不想从堆中为类A分配内存,所以在任何情况下,我们都需要让它运行语句uu thread A;@CppDeveloper如果您对类的动态allocs/deallocs没有问题,我看不出有任何问题。您的
A
实际上是一个
POD
,就像必需的一样。否则,您需要进行更改为
A
本身。最干净的方法似乎是@ecatmur建议的方法。查看线程A*A;以获得成功。