Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ __线程说明符不';t在C+中工作+;班_C++_Multithreading_Thread Local - Fatal编程技术网

C++ __线程说明符不';t在C+中工作+;班

C++ __线程说明符不';t在C+中工作+;班,c++,multithreading,thread-local,C++,Multithreading,Thread Local,我正在尝试使用_线程说明符来创建线程局部变量。这在以下代码中正常工作: #include <stdio.h> #include <pthread.h> static __thread int val; int main() { val = 10; } #包括 #包括 静态线程int val; int main() { val=10; } 但如果我尝试在类中使用_线程说明符,如下所示: #include <stdio.h> #include <

我正在尝试使用_线程说明符来创建线程局部变量。这在以下代码中正常工作:

#include <stdio.h>
#include <pthread.h>

static __thread int val;

int main()
{
  val = 10;
}
#包括
#包括
静态线程int val;
int main()
{
val=10;
}
但如果我尝试在类中使用_线程说明符,如下所示:

#include <stdio.h>
#include <pthread.h>

class A
{
public:
  A();
  static __thread int val;
};

A::A()
{
  val = 10;
}

int main()
{
  A a;
}
#包括
#包括
甲级
{
公众:
A();
静态线程int val;
};
A::A()
{
val=10;
}
int main()
{
A A;
}

我得到编译器错误:未定义对'A::val'的引用。

您只声明了静态变量;还必须在类外定义它(如果有多个源文件,则仅在一个源文件中):


您只声明了静态变量;还必须在类外定义它(如果有多个源文件,则仅在一个源文件中):


静态变量必须在类声明范围之外定义。像这样:

int A::val;

静态变量必须在类声明范围之外定义。像这样:

int A::val;

您应该将其定义为:

/\*static\*/ __thread int A::val;

\u thread
关键字必须位于
int

前面。您应该像这样定义它:

/\*static\*/ __thread int A::val;

\u thread
关键字必须在
int

之前,这不是编译器错误。这是链接器错误。可能的重复不是编译器错误。这是链接器错误。可能是@KerrekSB:的重复项,我也不熟悉:)。但现在我已经设法启动了编译器,并确认您在定义中确实需要它。@KerrekSB:不幸的是,它不是,因为u-thread不知道有关CTOR和DTOR的信息。@Plasmah:您确定吗,即使在
g++
中使用
-std=c++11
?有趣。但我认为它在语法上起着同样的作用。@KerrekSB:是的,我是(至少对于GCC4.7来说,我不知道是否有任何计划改变它)。请注意,在C++11中,thread_local本身就是一个存储类说明符,而gcc扩展只是一个“特殊的静态”。所以“\u线程静态”类似于“线程本地”。@KerrekSB:我也不熟悉:)。但现在我已经设法启动了编译器,并确认您在定义中确实需要它。@KerrekSB:不幸的是,它不是,因为u-thread不知道有关CTOR和DTOR的信息。@Plasmah:您确定吗,即使在
g++
中使用
-std=c++11
?有趣。但我认为它在语法上起着同样的作用。@KerrekSB:是的,我是(至少对于GCC4.7来说,我不知道是否有任何计划改变它)。请注意,在C++11中,thread_local本身就是一个存储类说明符,而gcc扩展只是一个“特殊的静态”。因此“\uu线程静态”类似于“thread\u local”。非整数静态变量必须在类声明外初始化,但任何类型都可以在类内声明。非整数静态变量必须在类声明外初始化,但任何类型都可以在类内声明。