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”。非整数静态变量必须在类声明外初始化,但任何类型都可以在类内声明。非整数静态变量必须在类声明外初始化,但任何类型都可以在类内声明。