zoukankan      html  css  js  c++  java
  • 每天进步一点点——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++网络库





  • 相关阅读:
    POJ 3660 Cow Contest (floyd求联通关系)
    POJ 3660 Cow Contest (最短路dijkstra)
    POJ 1860 Currency Exchange (bellman-ford判负环)
    POJ 3268 Silver Cow Party (最短路dijkstra)
    POJ 1679 The Unique MST (最小生成树)
    POJ 3026 Borg Maze (最小生成树)
    HDU 4891 The Great Pan (模拟)
    HDU 4950 Monster (水题)
    URAL 2040 Palindromes and Super Abilities 2 (回文自动机)
    URAL 2037 Richness of binary words (回文子串,找规律)
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5274519.html
Copyright © 2011-2022 走看看