linux 线程局部,Linux中的线程局部存储(2)

__thread是GCC内置的线程局部存储设施(Thread-Local Storage),它的实现非常高效,与pthread_key_t向比较更为快速,其存储性能可以与全局变量相媲美,而且使用方式也更为简单。创建线程局部变量只需简单的在全局或者静态变量的声明中加入__thread说明即可。列如:

1

2 static __thread char t_buf[32]={'\0'};

extern __thread int t_val=0;

凡是带有__thread的变量,每个线程都拥有该变量的一份拷贝,且互不干扰。线程局部存储中的变量将一直存在,直至线程终止,当线程终止时会自动释放这一存储。__thread并不是所有数据类型都可以使用的,因为其只支持POD(Plain old data structure)[1]类型,不支持class类型——其不能自动调用构造函数和析构函数。同时__thread可以用于修饰全局变量、函数内的静态变量,但是不能用于修饰函数的局部变量或者class的普通成员变量。另外,__thread变量的初始化只能用编译期常量,例如:

1

2

3 __threadstd::stringt_object_1('Swift');          // 错误,因为不能调用对象的构造函数

__threadstd::string*t_object_2= new std::string(); // 错误,初始化必须用编译期常量

__threadstd::string*t_object_3= nullptr;        // 正确,但是需要手工初始化并销毁对象

除了以上之外,关于线程局部存储变量的声明和使用还需注意一下几点:如果变量声明中使用量关键字static或者extern,那么关键字__thread必须紧随其后。

与一般的全局变量或静态变量一样,线程局部变量在声明时可以设置一个初始化值。

可以使用C语言取地址符(&)来获取线程局部变量的地址。

__thread的使用例子可参考 https://github.com/ApusApp/Swift/blob/master/swift/base/logging.cpp 的实现及其单元测试对于那些非POD数据类型,如果想使用线程局部存储机制,可以使用对pthread_key_t封装的类来处理,具体方式可参考https://github.com/ApusApp/Swift/blob/master/swift/base/threadlocal.h 的实现以及其的单元测试

拿高薪,还能扩大业界知名度!优秀的开发工程师看过来 ->《高薪招募讲师》

1 赞 1 收藏 评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值