c/c++ 多线程 thread_local 类型
程序员文章站
2022-05-18 14:34:48
多线程 thread_local 类型 thread_local变量是C++ 11新引入的一种存储类型。 thread_local关键字修饰的变量具有线程周期(thread duration), 这些变量(或者说对象)在线程开始的时候被生成(allocated), 在线程结束的时候被销毁(deall ......
多线程 thread_local 类型
thread_local变量是c++ 11新引入的一种存储类型。
- thread_local关键字修饰的变量具有线程周期(thread duration),
- 这些变量(或者说对象)在线程开始的时候被生成(allocated),
- 在线程结束的时候被销毁(deallocated)。
- 并且每 一个线程都拥有一个独立的变量实例(each thread has its own instance of the object)。
-
thread_local
可以和static
与extern
关键字联合使用,这将影响变量的链接属性(to adjust linkage)。
例子:
#include <iostream> #include <thread> struct s { s() { printf("s() called i=%d\n", i); } int i = 0; }; //thread_local s gs; s gs; void foo() { gs.i += 1; printf("foo %p, %d\n", &gs, gs.i); } void bar() { gs.i += 2; printf("bar %p, %d\n", &gs, gs.i); } int main() { std::thread a(foo), b(bar); a.join(); b.join(); }
执行结果:结构体s只生成了一个对象实例,并且2个线程是共享这个实例的,可以看出实例的内存地址相同
s() called i=0 bar 0x55879165501c, 2 foo 0x55879165501c, 3
如果把:s gs;加上thread_local关键字,
thread_local s gs;
执行结果:结构体s在每个线程中都生成了一个实例,可以看出实例的内存地址不相同。
s() called i=0 bar 0x7f23eb2506f8, 2 s() called i=0 foo 0x7f23eba516f8, 1
c/c++ 学习互助qq群:877684253
本人微信:xiaoshitou5854
推荐阅读
-
C++入门到理解阶段二基础篇(3)——C++数据类型
-
c++ string类型成员变量在调用构造函数后未能正确赋值
-
C++数据类型(data type)介绍
-
c/c++编程排坑(1)-- 数据类型的“安静”转换
-
C++雾中风景11:厘清C++类型转换(static_cast,dynamic_cast,reinterpret_cast,const_cast)
-
c++ 模板类,方法返回值类型是typedef出来的,或者是auto,那么此方法在类外面如何定义?
-
c/c++ 多线程 等待一次性事件 std::promise用法
-
c/c++ 多线程 多个线程等待同一个线程的一次性事件
-
C++负数类型转换,-1对256取模
-
c/c++ 多线程 利用条件变量实现线程安全的队列