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

2023-11-17

转载:http://blog.csdn.net/cywosp/article/details/26876231


     在Linux中还有一种更为高效的线程局部存储方法,就是使用关键字__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. 如果变量声明中使用量关键字static或者extern,那么关键字__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++网络库
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 方差分析(ANOVA)的基本原理及R实现(单因素)

    方差分析 analysis of variance ANOVA 几乎是在统计学分析中最常用的方法 通过分析各变量的主效应 main effect 和交互效应 interaction effect 从而发现因变量 dependent vari
  • 音标发音规则

    一 辅音字母的读音规则 1 c 在字母e i y前读 s 如cell cit y cyst 其余情况下读 K 如cat club code 2 g 在字母e i y前读 如gene gin gym 其余情况下读 g 如beg golf ga
  • [图论]---[网络流]---最大权闭合子图

    最大权闭合子图 闭合图的概念 闭合图建立在有向图之上 对于 G V E 选取一个点的子集 V V 的任意一点的所有能到达的点也在集合 V 内 则称 V 为闭合子图 最大权闭合子图即在G的所有闭合子图中 点权和最大的 最大权闭合子图的求法 构
  • JDK1.8新特性---------lambda

    1 Lambda表达式 1 1 概念 Lambda表达式 特殊的匿名内部类 语法更加简洁 是JDK1 8中的新特性 Lambda表达式允许把函数作为一个方法的参数 函数作为方法参数传递 将代码像数据一样传递 1 2 需求 1 开启一个线程
  • CTK系列之插件制作

    CTK插件制作 说明 1 将上篇我们提到的ctk路径创建ctk pro包含到每一个插件中 include PWD ctk ctk pri 2 可以自定义一个公共代码仓common并创建common pri同样包含到每一个插件中 includ
  • php前端取blob数据,前端读取Blob内容

    简述 前端由于安全方面的因素 不能直接对文件进行写操作 但是在实际的业务需求中 难免会遇到各种各样文件的下载 预览 如果服务端下载文件是以流的形式传递到前端 前端通常是将流转换为objectURL 借用a标签的download属性 进行文件
  • 后台扫描工具 - 御剑(珍藏版)附下载

    版本说明 御剑后台扫描珍藏版 下载地址 安装包放下方网盘里了 链接 https pan baidu com s 1Bn7GtWb7AStcjzVahFOjSQ 提取码 zkaq 使用环境 windows 标题工具说明 御剑后台扫描珍藏版是T
  • Pytorch版本的Ernie Health源码详解

    Pytorch版本的Ernie Health源码详解 一 目录架构 二 尝试使用Ernie Health import torch 查看torch版本 torch version 1 12 0 cpu 查看设备是否有GPU资源 device
  • 方差分析、T检验、卡方分析如何区分

    方差分析 T检验 卡方分析如何区分 差异研究的目的在于比较两组数据或多组数据之间的差异 通常包括以下几类分析方法 分别是方差分析 T检验和卡方检验 1 三个方法的区别 1 其核心的区别在于 数据的类型不一样 如果是定类和定类 此时应该使用卡
  • 在MacOS上安装GraphViz并用PlantUML绘制UML图

    文章目录 在MacOS上安装GraphViz并用PlantUML绘制UML图 在MacOS上安装Graphviz 在VSCode上安装PlantUML插件 用PlantUML绘制UML图 在MacOS上安装GraphViz并用PlantUM
  • Python矩阵赋值详解

    在Python中 矩阵是一种常见的数据结构 广泛应用于数学 科学和工程领域 在本文中 我们将详细介绍如何使用Python给矩阵赋值 在Python中 可以使用多种方式来表示和操作矩阵 其中最常用的是使用嵌套列表或NumPy库中的数组对象 我
  • JavaScript高级技巧:深入探索JavaScript语言的高级特性和用法

    当我们谈论JavaScript高级技巧时 以下是一些示例来说明这些概念 闭包 Closures function outerFunction var outerVariable Hello function innerFunction co
  • 自从学了这套框架,自动化+性能都搞定了

    框架介绍 1 HttpRunner 是一款面向 HTTP S 协议的通用测试框架 只需编写维护一份YAML JSON脚本 即可实现自动化测试 性能测试 线上监控 持续集成等多种测试需求 2 Locust Locust是一款易于使用的分布式用
  • 数据库关系代数运算之连接

    联接有三种 联接和自然联接 这里是算术比较符 外联接 1 联接 从R和S的笛卡儿乘积中选取满足条件 i j 的元组 2 自然联接 naturaljoin 两个关系R和S的自然联接操作具体计算过程如下 计算R S 设R和S的公共属性是A1 A

随机推荐

  • 【转】SQL删除的三个语句:DROP、TRUNCATE、 DELETE 的区别

    主要介绍了SQL删除语句DROP TRUNCATE DELETE 的区别 帮助大家更好的理解和学习sql语句 感兴趣的朋友可以了解下 DROP 1 DROP TABLE test 删除表test 并释放空间 将test删除的一干二净 TRU
  • CMake Error: Maybe need administrative privileges.

    安装opencv时 到make install 这一步报错 解决 权限不够 前面加上sudo 即 sudo make install
  • qt中的QString::number()的精度使用问题

    1 QString number average f 5 这里的 f 表示的是 f 方式结果是0 00 所以后面的5表示的就是输出的时候保留5位小数 通常 QString str str QString number 23 34567899
  • 使用tp5内cache缓存,存储手机短信验证码

    设置手机短信验证码缓存方法 设置手机短信验证码缓存 User JW Email jw 333 163 com Date param data cache public function setRegSmsCache data cache C
  • Gitee API的使用|如何批量删除Gitee下的所有仓库

    前言 那么这里博主先安利一些干货满满的专栏了 首先是博主的高质量博客的汇总 这个专栏里面的博客 都是博主最最用心写的一部分 干货满满 希望对大家有帮助 高质量博客汇总https blog csdn net yu cblog category
  • python语音播报

    python3 pip install pyttsx3 python2 pip install pyttsx 文本转语音 import pyttsx3 import time str Come on Catherine engine pyt
  • java 强密码验证策略工具类

    java 强密码验证策略工具类 package com neusoft caeid common utils import java util regex Matcher import java util regex Pattern aut
  • ChatGPT论文考试满绩,高等教育该如何应对人工智能挑战?

    近日 ChatGPT引发热议 一方面 ChatGPT表现亮眼 有大学生利用ChatGPT在开卷课堂上取得满绩的优异成绩 另一方面 部分院校 学术期刊却对ChatGPT在高等教育领域的推进保持谨慎态度 甚至有高校明确禁止这项工具技术的使用 那
  • 算法题:Rod Cutting

    算法题 Rod Cutting 一 题目 二 代码 三 结果 一 题目 二 代码 lengths 1 1 3 4 lengths 5 4 4 2 2 8 def rodOffcut lengths resut resut append le
  • Android自定义控件--如何在XML文件中使用自定义属性

    前言 你好 我是Cici 这几天在做一个小项目的时候 用到了自定义控件 为了方便在XML中进行配置 于是需要用到自定义属性 特此记下用法 方便复习的同时也希望对大家有所帮助 一 为什么需要自定义控件 Android本身提供了很多控件 比如T
  • 1024 视频拼接

    题目描述 你将会获得一系列视频片段 这些片段来自于一项持续时长为 T 秒的体育赛事 这些片段可能有所重叠 也可能长度不一 视频片段 clips i 都用区间进行表示 开始于 clips i 0 并于 clips i 1 结束 我们甚至可以对
  • pyinstaller打包Transformers 报错No such file or directory

    问题描述 Traceback most recent call last File transformers utils import utils py line 1086 in get module File importlib init
  • Go开发者路线图2019,请收下这份指南

    Go是Google开发的一种静态 强类型 编译型 并发型 并具有垃圾回收功能的类C编程语言 2009以开源项目的形式发布 2012年发布1 0稳定版本 距今已经十年了 其性能类似于Java和C 但速度极快 适合搭载于web服务器 用于高性能
  • LeetCode1652. 拆炸弹

    题目描述 1652 拆炸弹 力扣 LeetCode 题目描述看的不是很清楚 直接看用例 这道题是简单题 取模 防止数组访问越界 C语言代码如下 int decrypt int code int codeSize int k int retu
  • 数据分桶

    数据分桶是一种数据预处理技术 用于减少次要观察误差的影响 是一种将多个连续值分组为较少数量的 桶 的方法 例如 例如我们有一组关于人年龄的数据 如下图所示 现在我们希望将他们的年龄分组到更少的间隔中 可以通过设置一些条件来实现 分桶的数据不
  • (Java)leetcode-945 Minimum Increment to Make Array Unique(使数组唯一的最小增量)

    题目描述 给定整数数组 A 每次 move 操作将会选择任意 A i 并将其递增 1 返回使 A 中的每个值都是唯一的最少操作次数 示例 1 输入 1 2 2 输出 1 解释 经过一次 move 操作 数组将变为 1 2 3 示例 2 输入
  • 在ubuntu上搭建文件服务器

    首先需要在ubuntu上下载好文件资源 一共是三个资源 在下载资源之前建议将git和nginx安装好 在本教程中将会用到 ngnix http nginx org download nginx 1 12 2 tar gz 利用winscp上
  • osg学习(五十一)Warning: detected OpenGL error ‘invalid operation‘ at after RenderBin::draw(..)

    原因是什么 这个错误只出现一次 并且是在第一帧时出现 Warning detected OpenGL error invalid operation after applying attribute Viewport 04292398 应该
  • 华为OD笔试题:工作安排 --- 100分 (思路+python代码)

    题目 小明每周上班都会拿到自己的工作清单 工作清单内包含n项工作 每项工作都有对应的耗时时长 单位h 和报酬 工作的总报酬为所有已完成工作的报酬之和 那么请你帮小明安排一下工作 保证小明在指定的工作时间内工作收入最大化 输入描述 输入的第一
  • 每天进步一点点——Linux中的线程局部存储(二)

    转载 http blog csdn net cywosp article details 26876231 在Linux中还有一种更为高效的线程局部存储方法 就是使用关键字 thread来定义变量 thread是GCC内置的线程局部存储设施