在c ++ 0x中使用__thread

时间:2011-08-12 23:05:45

标签: c++ multithreading c++11

我读到C ++中有一个新的关键字:它是我读过的__thread

我所知道的是它是一个像static关键字一样使用的关键字,但我什么都不知道。这个关键字是否仅仅意味着,例如,如果变量被声明为:

__thread int foo;

那么与该变量有关的任何内容都将用新线程执行?

4 个答案:

答案 0 :(得分:24)

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

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

来自this link

  

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


我认为通过在C ++ 0x中引入标准化内存模型可以实现这个关键字的引入:

答案 1 :(得分:20)

来自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 ++,Intel C / C ++(Windows系统),Borland C ++ Builder和Digital Mars C ++使用语法:

    __declspec(thread) int number;
     

Borland C ++ Builder还支持语法:

    int __thread number;

因此,虽然__thread 在实践中和某些系统上存在,但thread_local是新的官方C ++ 0x关键字,它执行相同的操作。< / p>

只要您有权访问C ++ 0x,就更喜欢非__thread

答案 2 :(得分:5)

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

答案 3 :(得分:2)

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