转载请说明出处:http://blog.csdn.net/cywosp/article/details/26876231

   
在Linux中另一种更为高效的线程局部存储方法,就是使用keyword__thread来定义变量。__thread是GCC内置的线程局部存储设施(Thread-Local Storage),它的实现很高效。与pthread_key_t向比較更为高速。其存储性能能够与全局变量相媲美,并且使用方式也更为简单。创建线程局部变量仅仅需简单的在全局或者静态变量的声明中增加__thread说明就可以。列如:
    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变量的初始化仅仅能用编译期常量。比如:

    __thread std::string t_object_1 ("Swift");
                  // 错误。由于不能调用对象的构造函数
    __thread std::string* t_object_2 = new std::string
(); // 错误,初始化必须用编译期常量
    __thread std::string* t_object_3 = nullptr;
               // 正确,可是须要手工初始化并销毁对象

除了以上之外。关于线程局部存储变量的声明和使用还需注意一下几点:
  1. 假设变量声明中使用量keywordstatic或者extern。那么keyword__thread必须紧随其后。
  2. 与一般的全局变量或静态变量一样。线程局部变量在声明时能够设置一个初始化值。
  3. 能够使用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] http://zh.wikipedia.org/wiki/POD_(%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1)
[2] Linux/UNIX系统编程手冊(上)
[3] Linux多线程服务端编程使用muduo C++网络库





每天进步一点点——Linux中的线程局部存储(二)的更多相关文章

  1. 每天进步一点点——Linux中的线程局部存储(一)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/26469435    在Linux系统中使用C/C++进行多线程编程时,我们遇到最多的就是对同 ...

  2. linux中的线程局部存储(TLS)

    http://blog.csdn.net/cywosp/article/details/26469435

  3. C#中的线程(二)线程同步

    C#中的线程(二)线程同步   Keywords:C# 线程Source:http://www.albahari.com/threading/Author: Joe AlbahariTranslato ...

  4. 在Linux中使用线程

    我并不假定你会使用Linux的线程,所以在这里就简单的介绍一下.如果你之前有过多线程方面的编程经验,完全可以忽略本文的内容,因为它非常的初级. 首先说明一下,在Linux编写多线程程序需要包含头文件p ...

  5. Linux中-POSIX 线程详解

    一种支持内存共享的简捷工具   摘自https://www.ibm.com/developerworks/cn/linux/thread/posix_thread1/ 线程是有趣的 了解如何正确运用线 ...

  6. Linux中epoll+线程池实现高并发

    服务器并发模型通常可分为单线程和多线程模型,这里的线程通常是指“I/O线程”,即负责I/O操作,协调分配任务的“管理线程”,而实际的请求和任务通常交由所谓“工作者线程”处理.通常多线程模型下,每个线程 ...

  7. 每天进步一点点——Linux中的文件描写叙述符与打开文件之间的关系

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述     在Linux系统中一切皆能够看成是文件,文件又可分为:普通 ...

  8. linux中的线程同步:生产者、消费者问题

    #include <stdio.h> #include <semaphore.h> #include <unistd.h> #include <stdlib. ...

  9. C#中的线程(二)线程同步基础 (读后感)

    参考文章:https://www.cnblogs.com/dingfangbo/p/5769501.html 一.lock 确保只有一个线程访问某个资源或某段代码.通俗的讲就是多个线程操作相同的锁对象 ...

随机推荐

  1. POJ 1690 (Your)((Term)((Project)))

    (Your)((Term)((Project))) Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2912   Accept ...

  2. hdu6035[dfs+思维] 2017多校1

    /*hdu6035[dfs+思维] 2017多校1*/ //合并色块, 妙啊妙啊 #include<bits/stdc++.h> using namespace std; ; const ...

  3. UVa——1593Alignment of Code(string重定向+vector数组)

    UVA - 1593 Alignment of Code Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & ...

  4. javaweb-简单的验证码和算术验证码

    我们登陆网站时,每次都会填写一些验证码,这些验证码的作用:防止被恶意攻击,验证码上面的字母数字一般都是随机生成的,因此我们首先要写一个方法生成一个随机的字符串,这里就需要java里面的随机函数Rand ...

  5. BZOJ 4555 [Tjoi2016&Heoi2016]求和 ——分治 NTT 多项式求逆

    不想多说了,看网上的题解吧,我大概说下思路. 首先考察Stirling的意义,然后求出递推式,变成卷积的形式. 然后发现贡献是一定的,我们可以分治+NTT. 也可以直接求逆(我不会啊啊啊啊啊) #in ...

  6. py-faster-rcnn 的makefile.config 注意事项

    在配置py-faster-rcnn的过程中,我遇到一些问题,记录如下 py-faster-rcnn文件夹下面有一个caffe-fast-rcnn文件夹 这个过程中,我们需要编译caffe, rbgir ...

  7. 求N维前缀和

    转载自http://blog.csdn.net/jzhang1/article/details/50528549#comments 膜拜 #include <iostream> #incl ...

  8. 快充 IC BQ25896 的 input current monitor

    BQ25896 沒有顯示 input current 的 register, 但可以讀 ILIM pin 的 電壓 做計算求出 input current.

  9. hdu3947 给一些已知(需费用)路径去覆盖一些边 //预先加灌法费用流

    River Problem 题意:一个有向树(河流),只有一个汇点1,每条边只有一个出度.有些河道有污染指数xi,必需要治理,有m段路径,可以去覆盖这些,每被覆盖一次,xi降低响应值. :即 给出一些 ...

  10. Java 添加播放MIDI音乐

      Java 在多媒体处理方面的确优势不大,但是我们在程序中有些时候又需要一些音乐. 如果播放的音乐是wav等波形音频文件,又很大的话,所以背景音乐最好就是MIDI了. 网上很多播放MIDI的教程都是 ...