在c ++ 0x中使用__thread

luc*_*kyl 15 c++ multithreading c++11

我读到C++中有一个新关键字:它__thread来自我读过的内容.

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

__thread int foo;
Run Code Online (Sandbox Code Playgroud)

然后用新线程执行与该变量有关的任何事情?

Naw*_*waz 25

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

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

这个链接:

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


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

  • GNU,clang等支持__thread.它在thread_local之前可用......它们不是等效的,并且都受支持.不同之处在于thread_local使用延迟初始化来仅在访问它的线程中初始化变量.__thread根本没有初始化,您必须为每个线程手动初始化它.因此,thread_local每次访问都有开销而__thread没有.由于效率低下,Apple的编译器禁用thread_local而不是线程,虽然__thread并非在所有编译器上都可用,但__thread可用于GNU工具. (4认同)

Lig*_*ica 21

来自维基百科关于"线程本地存储"的文章:

线程局部存储(TLS)是一种计算机编程方法,它使用线程本地的静态或全局内存.

有时需要这样做,因为通常进程中的所有线程共享相同的地址空间,这有时是不合需要的.

和:

C++ 0x引入了thread_local关键字.除此之外,各种C++编译器实现提供了声明线程局部变量的特定方法:

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

    __thread int number;
Run Code Online (Sandbox Code Playgroud)

Visual C++,Intel C/C++(Windows系统),Borland C++ Builder和Digital Mars C++使用以下语法:

    __declspec(thread) int number;
Run Code Online (Sandbox Code Playgroud)

Borland C++ Builder还支持以下语法:

    int __thread number;
Run Code Online (Sandbox Code Playgroud)

因此,虽然在实践和某些系统中__thread 确实存在,thread_local但是新的官方C++ 0x关键字也能做同样的事情.

__thread无论何时访问C++ 0x,都希望它是非标准的.


Nic*_*las 5

关键字被调用thread_local.这意味着每个线程都有自己的变量版本.