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


    转载请说明出处: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] = {''};
        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++网络库





  • 相关阅读:
    地税某数据库异常重启和重启后数据库运行缓慢问题的解决过程
    Oracle 索引 详解
    oracle数据库优化基本概念
    oracle物理读和逻辑读
    SQL 优化之该走索引却不走索引的分析(二)
    数据仓库中的分区修剪
    查询低效率的sql语句
    oracle优化的几个简单步骤
    VBS类似于ceil的函数
    ruby符号的应用
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5274519.html
Copyright © 2020-2023  润新知