2011-08-12 61 views
14

我读到C++中有一个新的关键字:它是我读过的__thread在C++中使用__thread 0x

我只知道它是一个关键字,就像static关键字一样使用,但我什么也不知道。这是否只是关键字意味着,例如,如果一个变量被宣布像这样:

__thread int foo; 

那么任何与该变量将与一个新的线程来执行?

+0

你从哪里读到的? –

回答

21

这是thread_local,而不是__thread。它用于定义具有线程存储持续时间的变量。

thread_local新的在C++ 0x中添加了存储持续时间说明符。还有其他的存储持续时间:静态自动动态

this link

线程本地存储持续时间(C++ 11功能)。变量在线程开始时分配,线程结束时释放。每个线程都有自己的变量实例。只有声明thread_local的变量才具有这个存储持续时间。


我认为引入这种关键字的通过引入在C语言的标准存储器模型成为可能++ 0x中:

+0

whoa,答案看起来与3分钟前完全不同。 –

+0

@Mooing:现在确实如此。 – Nawaz

+0

“'thread_local'是在C++ 03中添加的一个新的存储持续时间说明符”:这是什么废话? –

5

该关键字被称为thread_local。这意味着每个线程都有自己的那个变量版本。

2

否,但它确实不表示“与该变量有关的任何内容都将使用新线程执行”。这意味着每个存在的线程都会有一个变量副本,每个线程只能看到它自己的变量副本。

+1

在C++ 0x/11中没有关键字叫做__thread。 –

19

the Wikipedia article on "Thread-local storage"

线程本地存储(TLS)是使用 静态或全局内存线程局部计算机编程方法。

这有时需要的,因为通常在过程的所有线程 共享相同的地址空间,这是不希望有时。

和:

的C++ 0x引入了thread_local关键字。除此之外的是,各种C++ 编译器实现提供具体的方式来声明线程局部 变量:

的Sun Studio C/C++,IBM XL C/C++,GNU C和Intel C/C++(Linux系统)使用的语法:

__thread int number; 

的Visual C++,英特尔C/C++(Windows系统),用Borland C++ Builder和数字火星C++使用语法:

__declspec(thread) int number; 

的Borland C++ Builder还支持语法:

int __thread number; 

所以,虽然__thread确实在实践中存在,在某些系统上,thread_local是新的,正式的,C++ 0x中的关键字,做同样的事情。

只要您有权访问C++ 0x,就可以使用非标准__thread