在c++0x中使用__thread
Using __thread in c++0x
我读到c++中有一个新的关键字:__thread
。
我只知道它是一个关键字,像static
关键字一样被使用,但我什么都不知道。这个关键字是否意味着,例如,如果像这样声明一个变量:
__thread int foo;
那么与该变量有关的任何内容都将在新线程中执行?
是thread_local
,不是__thread
。它用于定义具有线程存储时间的变量。
thread_local
是c++ 0x中新增的存储时间指定符。还有静态、自动和动态。
从这个链接:
线程本地存储时间(c++ 11特性)。该变量在线程开始时被分配,在线程结束时被释放。每个线程都有自己的变量实例。只有声明为thread_local的变量才有这个存储时间。
我认为这个关键字的引入是通过在c++ 0x中引入一个标准化的内存模型来实现的:
- c++ 11引入了一个标准化的内存模型。这是什么意思?它将如何影响c++编程?
摘自维基百科关于"线程本地存储"的文章:
线程本地存储(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关键字,它做同样的事情。
当您可以访问c++ 0x时,请选择非标准__thread
关键字为thread_local
。这意味着每个线程都有自己版本的变量
不,不是意味着"与该变量有关的任何内容都将在新线程中执行"。这意味着每个存在的线程都有一个变量的副本,每个线程只能看到它自己的变量副本。
- 在std::thread中,joinable()然后join()线程安全吗
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 分离一个静态常量 std::thread?
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- 使用 thread 类在 C++ 中构造线程的动态数组时出错
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 如何从 std::thread 返回值
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 将 std::thread by 值推送到列表中
- 转发变量参数列表以模拟 std::thread
- 嵌入式设备 -> std::thread -> FreeRTOS?
- 对 'std::thread::_M_start_thread CMake 的未定义引用进行基准测试
- std::thread 增加 DLL 引用计数,从而防止卸载 DLL
- 如何防止 std::thread 在 QT 中冻结 GUI?
- 定义宏以将前缀 0x 添加到十六进制字符串文本
- 0x%08lx 格式说明符在 printf 语句到 cout
- 对带有唯一指针的 std::thread 使用类成员函数时出现编译错误
- C++ - Thread Pool
- 为什么参数在构造 std::thread 时移动两次
- 使用C++0x std::thread调用新ed对象中的成员函数