c++11 中添加了新的关键字thread_local,用来声明新的存储期(线程存储期变量),即线程局部变量。
程序中的所有对象拥有下列存储期之一:
1 自动存储期。对象的存储在外围代码块开始时分配,而在结束时解分配。除了声明为 static 、 extern 或 thread_local 的所有局部对象拥有此存储期。
2 静态存储期。对象的存储在程序开始时分配,而在程序结束时解分配。只存在对象的一个实例。所有声明于命名空间作用域(包含全局命名空间)的对象,加上声明带有 static 或 extern 的对象拥有此存储期。
3 线程存储期。对象的存储在线程开始时分配,而在线程结束时解分配。每个线程拥有其自身的对象实例。唯有声明为 thread_local 的对象拥有此存储期。 thread_local 能与 static 或 extern 一同出现,以调整链接。
4 (C++11 起)动态存储期。通过使用动态内存分配函数,由请求分配和解分配对象的存储。
thread_local修饰的变量具有如下特性:
- 变量在线程创建时生成(不同编译器实现略有差异,但在线程内变量第一次使用前必然已构造完毕)。
- 线程结束时被销毁(析构,利用析构特性,thread_local变量可以感知线程销毁事件)。
- 每个线程都拥有其自己的变量副本。
- thread_local可以和static或extern联合使用,这将会影响变量的链接属性。
关于链接属性,参考以下资料:
https://blog.csdn.net/luoshabugui/article/details/86699001
https://www.cnblogs.com/magicsoar/p/3840682.html
https://blog.csdn.net/Hansry/article/details/80207143