当前位置:嗨网首页>书籍在线阅读

10-线程局部存储

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

31.4 线程局部存储

类似于线程特有数据,线程局部存储提供了持久的每线程存储。作为非标准特性,诸多其他的 UNIX 实现(例如Solaris和FreeBSD)为其提供了相同,或类似的接口形式。

线程局部存储的主要优点在于,比线程特有数据的使用要简单。要创建线程局部变量,只需简单地在全局或静态变量的声明中包含__thread说明符即可。

840.png 但凡带有这种说明符的变量,每个线程都拥有一份对变量的拷贝。线程局部存储中的变量将一直存在,直至线程终止,届时会自动释放这一存储。

关于线程局部变量的声明和使用,需要注意如下几点。

  • 如果变量声明中使用了关键字static或extern,那么关键字__thread必须紧随其后。
  • 与一般的全局或静态变量声明一样,线程局部变量在声明时可设置一个初始值。
  • 可以使用C语言取址操作符(&)来获取线程局部变量的地址。

线程局部存储需要内核(由Linux 2.6提供)、Pthreads实现(由NPTL提供)以及C编译器(在x86-32平台上由gcc 3.3或后续版本提供)的支持。

程序清单31-4提供了使用线程局部存储实现线程安全版strerror()函数的例子。如果用该版strerror()与测试程序(程序清单31-2)编译、链接、生成strerror_test_tls,那么运行时将产生如下结果:

841.png 程序清单31-4:使用线程局部存储实现线程安全版的strerror()函数

842.png