Thread Local Storage---__thread 关键字的使用方法

2023-11-18

转自:http://blog.csdn.net/yusiguyuan/article/details/22938671

  __thread是GCC内置的线程局部存储设施,存取效率可以和全局变量相比。__thread变量每一个线程有一份独立实体,各个线程的值互不干扰。可以用来修饰那些带有全局性且值可能变,但是又不值得用全局变量保护的变量。

       __thread使用规则:只能修饰POD类型(类似整型指针的标量,不带自定义的构造、拷贝、赋值、析构的类型,二进制内容可以任意复制memset,memcpy,且内容可以复原),不能修饰class类型,因为无法自动调用构造函数和析构函数,可以用于修饰全局变量,函数内的静态变量,不能修饰函数的局部变量或者class的普通成员变量,且__thread变量值只能初始化为编译器常量(值在编译器就可以确定const int i=5,运行期常量是运行初始化后不再改变const int i=rand()).

Thread Local Storage

   线程局部存储(tls)是一种机制,通过这一机制分配的变量,每个当前线程有一个该变量的实例.
  gcc用于实现tls的运行时模型最初来自于IA-64处理器的ABI,但以后被用到其它处理器上。它需要链接器(ld),动态连接器(ld.so)和系统库(libc.so,libpthread.so)的全力支持.因此它不是到处可用的。
     在用户层,用一个新的存储类型关键字:__thread表示这一扩展。例如:
                        __thread int i;
                          extern __thread struct state s;
                          static __thread char *p;
    __thread限定符(specifier)可以单独使用,也可带有extern或static限定符,但不能带有其它存储类型的限定符。
    __thread可用于全局的静态文件作用域,静态函数作用域或一个类中的静态数据成员。不能用于块作用域,自动或非静态数据成员。
    当应用addressof操作符于一个线程局部存储变量时,它被在运行时求值,返回该变量当前线程实例的地址。这样得到的地址可以被其它任何线程使用。当一个线程终止时,任何该线程中的线程局部存储变量都不再有效。静态初始化不会涉及到任何线程局部存储变量的地址。
     在c++中,如果一个线程局部存储变量有一个初始化器,它必须是常量表达式。


[cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. #include<iostream>  
  2. #include<pthread.h>  
  3. #include<unistd.h>  
  4. using namespace std;  
  5. const int i=5;  
  6. __thread int var=i;//两种方式效果一样  
  7. //__thread int var=5;//  
  8. void* worker1(void* arg);  
  9. void* worker2(void* arg);  
  10. int main(){  
  11.     pthread_t pid1,pid2;  
  12.     //__thread int temp=5;  
  13.     static __thread  int temp=10;//修饰函数内的static变量  
  14.     pthread_create(&pid1,NULL,worker1,NULL);  
  15.     pthread_create(&pid2,NULL,worker2,NULL);  
  16.     pthread_join(pid1,NULL);  
  17.     pthread_join(pid2,NULL);  
  18.     cout<<temp<<endl;//输出10  
  19.     return 0;  
  20. }  
  21. void* worker1(void* arg){  
  22.     cout<<++var<<endl;//输出 6  
  23. }  
  24. void* worker2(void* arg){  
  25.     sleep(1);//等待线程1改变var值,验证是否影响线程2  
  26.     cout<<++var<<endl;//输出6  
  27. }  

程序输出:

6

6         //可见__thread值线程间互不干扰

10



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Thread Local Storage---__thread 关键字的使用方法 的相关文章

  • so库的反编译,反汇编

    Linux APP SO的反汇编工具 ida Pro 可以反汇编app和SO库 有函数名 但是不能反编译到code这一级别 下载最强的反编译工具 ida Pro 6 4 Plus rar 还有这个反汇编工具 没用过 转自 http bbs
  • Python 中 import 的机制与实现

    转自 http python jobbole com 82604 本文所涉及到的代码在github上 概述 Python 是一门优美简单 功能强大的动态语言 在刚刚接触这门语言时 我们会被其优美的格式 简洁的语法和无穷无尽的类库所震撼 在真
  • boost::bind 详解

    转自 https www cnblogs com benxintuzi p 4862129 html boost bind是标准库函数std bind1st和std bind2nd的一种泛化形式 其可以支持函数对象 函数 函数指针 成员函数
  • MD5 加密算法详细介绍

    MD5是什么 message digest algorithm 5 信息 摘要算法 经常说的 MD5加密 就是它 信息 摘要算法 在下载一下东西时 经常在一些压缩包属性里 看到md5值 而且这个下载页面 很可能会在某一个地方 写了一句 此文
  • Unity3D protobuf-net使用方式

    1 下载protobuf net 2 创建Unity工程 创建一个Plugins文件夹 将protobuf net解压把里面得protobuf net放到Plugins 3 创建一个名为mcs的文本文件 里面写上 unsafe 4 重启Un
  • 需要注意字节序的大端(big endian)和小端(little endian)的几种情景

    大端 big endian 在内存中 按照从最低有效字节到最高有效字节的顺序存储对象 即数据的高字节 保存在内存的低地址中 而数据的低字节 保存在内存的高地址中 小端 little endian 在内存中 按照从最高有效字节到最低有效字节的
  • C++智能指针简单剖析

    转自 https www cnblogs com lanxuezaipiao p 4132096 html 导读 最近在补看 C Primer Plus 第六版 这的确是本好书 其中关于智能指针的章节解析的非常清晰 一解我以前的多处困惑 C
  • C++ STL之vector用法总结

    转自 https www cnblogs com zhonghuasong p 5975979 html 介绍 vector是表示可变大小数组的序列容器 就像数组一样 vector也采用的连续存储空间来存储元素 也就是意味着可以采用下标对v
  • 机器学习——深度学习(Deep Learning)

    Deep Learning是机器学习中一个非常接近AI的领域 其动机在于建立 模拟人脑进行分析学习的神经网络 最近研究了机器学习中一些深度学习的相关知识 本文给出一些很有用的资料和心得 Key Words 有监督学习与无监督学习 分类 回归
  • 广度/宽度优先搜索(BFS)

    转自 https blog csdn net raphealguo article details 7523411 1 前言 广度优先搜索 也称宽度优先搜索 缩写BFS 以下采用广度来描述 是连通图的一种遍历策略 因为它的思想是从一个顶点V
  • R与SPSS、SAS相比较_Python 在数据分析工作中的地位与R语言、SAS、SPSS 比较如何?

    转自 http m elecfans com article 611407 html 统计分析的软件和程序分析 能够用来做统计分析的软件和程序很多 目前应用比较广泛的包括 SPSS SAS R语言 Matlab S PLUS S Miner
  • C/C++编程笔记:C++中的指针与引用,又在什么时候使用?

    C和C 支持与大多数其他编程语言不同的指针 其他语言包括C Java Python Ruby Perl和PHP 从表面上看 引用和指针非常相似 都用于使一个变量提供对另一变量的访问 两者都提供了许多相同的功能 因此通常不清楚这些不同机制之间
  • QT学习——QFileSystemModel与QTreeView显示文件夹下的文件信息

    最近因为项目需求 使用QT做界面 新手学习 记录一些笔记 虽然QT已经做好了标准对话框的国际化 但是有时候对于中文的翻译可能达不到我们期望的 所以就需要我们自己来修改 比如下面的代码中 利用了国际化 写在main函数中 QApplicati
  • unique_ptr的使用和陷阱

    转自 https blog csdn net qq 33266987 article details 78784286 unique ptr的使用 分配内存 与shared ptr不同 unique ptr没有定义类似make shared
  • 24时区来源,CST,CET,UTC,DST,Unix时间戳概述、关系、转换

    全球24个时区的划分 相较于两地时间表 显示世界各时区时间和地名的世界时区表 Universal WorldTime 就显得精密与复杂多 通常世界时区表的表盘上会标示着全球24个时区的城市名称 全球24个时区是如何产生的 过去世界各地原本各
  • QT学习——QTreeView获取选中单行数据和多行数据

    个人感觉QTreeView有些地方的使用没有MFC的CListCtrl方便 比如在不响应单击信号的情况下 获取选中行的数据 单行和多行 也许因为我是新手吧 一 获取单行选中的数据 QModelIndex selected ui treeVi
  • C++11的时间新特性之high_resolution_clock

    转自 https blog csdn net cw hello1 article details 66476290 我在这里只是说一说high resolution clock的时间用法 这里有一个C 的网上的API地址 包含了C 11的新
  • Thread Local Storage---__thread 关键字的使用方法

    转自 http blog csdn net yusiguyuan article details 22938671 thread是GCC内置的线程局部存储设施 存取效率可以和全局变量相比 thread变量每一个线程有一份独立实体 各个线程的
  • C++回顾——引用和拷贝构造函数

    一 C 中的指针 C和C 指针的最重要的区别在于C 是一种类型要求更强的语言 C不允许随便地把一个类型的指针赋值给另一个类型 但允许通过void 来实现 C 不允许这样做 如果真想把某种类型当做别的类型处理 则必须显示地使用类型转换 二 C
  • 开源软件许可证—GPL、AGPL、LGPL、Apache、ZLIB/LIBPNG、MIT

    转自 http www dushibaiyu com 2013 08 E5 BC 80 E6 BA 90 E8 BD AF E4 BB B6 E8 AE B8 E5 8F AF E8 AF 81 gpl E3 80 81agpl E3 80

随机推荐

  • sql 优化

    sql 优化 1 mysql 基础架构 1 1 mysql 的组成 2 mysql 存储引擎 2 1MyISAM 2 2 InnoDB 2 3 MyISAM 和 InnoDB 的对比 3 mysql 索引 3 1 Hash 索引 3 2 B
  • QT 中的延时函数和精准定时器的用法

    一 QT中的延时函数比较常用的三种方法 第一种 void MainWindow Delay int msec 这个最准 非阻塞方式延时 现在很多人推荐的方法 QEventLoop loop QTimer singleShot msec lo
  • 知识点——初识java中File类

    1 1 什么是File类 SUN公司提供给开发者操作文件和文件夹的一个类对象 Java中万物皆对象 计算机中万物皆文件 获取File类有三种方式 Constructor 构造方法 File String pathName 根据对应的文件路径
  • 95-31-020-ChannelGroup-DefaultChannelGroup

    1 拓扑图
  • HT1621B液晶驱动(附电路图)

    最近做了一个项目用到了HT1621 电路图 datasheet code HT1621B datasheet include ht1621 h void ht1621 send high order data UCHAR data UCHA
  • JS实现数组扁平化的 5 种方式

    一 普通递归的思路很容易理解 就是通过for循环的方式 逐层逐个元素地去展平 如果当前元素是一个数组 那么就对它进行递归处理 再将递归处理的结果拼接到结果数组上 let arr 1 2 3 4 5 function flatten arr
  • 【简易广告机】利用树莓派制作一个简易的广告机(1)

    利用树莓派做一个简单的广告机 废话不多说开始 1 安装 omxplayer omxplayer 简易介绍 omxplayer是专门针对树莓派的GPU的播放器 支持硬件解码 最高支持分辨率是1080P omxplayer这个命令行播放器 是专
  • 怎么修改vue项目图标和标题

    要修改 Vue 项目的图标和标题 需要在 Vue 项目的 public 目录下添加 favicon ico 文件作为图标 并在 index html 中通过标签修改标题 具体步骤如下 在 public 目录下添加图标 favicon ico
  • 【环境配置】Collecting package metadata (current_repodata.json): failed的问题解决

    在使用conda创建新环境时 出现Collecting package metadata current repodata json failed的问题 尝试了很多方法都没有解决 最后解决了 解决链接 https download csdn
  • JPEG编码过程详解

    JPEG编码过程详解 本文旨在对JPEG编码过程中的细节步骤进行说明 具体原理部分请参照Wikipedia 色彩空间转换 原始图像的像素点是以RGB形式存储的 即每个像素点由3个字节的数据组成 分别为Red通道 Green通道和Blue通道
  • sqlite数据库查看里面数据库版本号

    在android sqlite数据库开发中 常会把手机上的具体数据库拷贝到电脑上进行查看 而数据库升级也比较多 升级也容易出问题 如果有时候某个用户报了一个bug或者测试测出一个bug 然后把他的数据库 db文件拷贝给你 这时候你需要先确定
  • 多线程:多个线程共享数据

    在 Java 传统线程机制中的共享数据方式 大致可以简单分两种情况 多个线程行为一致 共同操作一个数据源 也就是每个线程执行的代码相同 可以使用同一个 Runnable 对象 这个 Runnable 对象中有那个共享数据 例如 卖票系统就可
  • 更进一步!可视化一切递归算法!

    学算法认准 labuladong 后台回复课程查看精品课 点击卡片可搜索文章 在线学习网站 https labuladong gitee io algo 上次我发布了算法代码可视化功能 适配了我的网站和我的系列插件 最近我修复了一些 bug
  • 有测试辐射的软件,装个可以查看辐射的APP应用,测测你的手机辐射有多大

    近日关于一款检测手机辐射量的应用Tawkon开始受到媒体和用户关注 这款软件早在去年就已经准备推出iOS版本 最终因为苹果API限制被帮主拒绝 随后他们又开始准备Android版本 并于近日正式发布 手机辐射到现在依然是一个争议性话题 没有
  • 使用指针实现: 输入两个字符串,将这两个字符串连接后输出。

    使用指针实现 输入两个字符串 将这两个字符串连接后输出 include
  • SpringSecurity解决跨域问题的方法

    跨域问题产生原因 现在越来越多的项目都采用前后端分离的开发模式 以实现前后端代码解耦的目的 处于安全考虑 后端服务器对收到的请求进行了限制和区分 因此出现跨域访问不到数据的情况 什么是跨域 当协议 域名 端口号 有一个或多个不同时 前端请求
  • Jira、Redmine横向对比:哪个更适合做研发项目管理

    如果你是一个软件开发团队的成员或者负责人 你可能会遇到这样的问题 该选择哪种项目管理和协作工具来提高工作效率和质量 市面上有很多这样的工具 比如 Redmine 和 Jira 它们都有各自的优缺点 适合不同的场景和需求 本文将从以下几个方面
  • nginx之虚拟主机与请求的分发

    由于IP地址有限 因此经常存在多个主机域名对应同一个IP地址的情况 这时nginx conf中就可以按照server name 对应用户请求中的主机域名 并通过server块来定义虚拟主机 每个server块就是一个虚拟主机 它只处理与之相
  • spring boot学习:yaml配置文件

    实际上配置文件application properties还有application yaml application yml 我自己实际使用中 就是感觉用yaml能省不少 但是要注意换行空格符号 举个例子有两个属性 server port
  • Thread Local Storage---__thread 关键字的使用方法

    转自 http blog csdn net yusiguyuan article details 22938671 thread是GCC内置的线程局部存储设施 存取效率可以和全局变量相比 thread变量每一个线程有一份独立实体 各个线程的