变量生命符thread_local

news2024/11/18 17:43:37

thread_local是c++11为线程安全引进的变量声明符。

thread_local是一个存储器指定符:

所谓存储器指定符,其作用类似命名空间,指定了变量名的存储期以及链接方式。同类型的关键字还有:

  • static:静态或者线程存储期,同时指示是内部链接
  • extern:静态或线程存储期,同时提示是外部链接;
  • thread_local:线程存储期;
  • mutable:不影响存储期或链接

线程存储期:对象的存储在线程开始时分配,而在线程结束时解分配。每个线程拥有其自身的对象实例。唯有声明为 thread_local 的对象拥有此存储期。 thread_local 能与 static 或 extern 一同出现,以调整链接。 

thread_local作为全局变量:

#include <iostream>
#include <mutex>
#include <thread>

std::mutex _mutex;   

thread_local int x = 1;

void thread_func(const std::string& thread_name) {
    for (int i = 0; i < 50; i++) {
        x++;
        std::lock_guard<std::mutex> lock(_mutex);
        std::cout << "thread[" << thread_name << "]: x = " << x << std::endl;
    }
}

int main() {
    std::thread t1(thread_func, "1");
    std::thread t2(thread_func, "2");
    t1.join();
    t2.join();
    return 0;
}

打印结果:

 每个线程都拷贝了一份thread_local,所以它们各自互不干扰,去掉thread_local的打印如下:

两个线程共享一个全局变量,最终结果打印为101; 

thread_local作为局部变量:

#include <iostream>
#include <mutex>
#include <thread>

std::mutex _mutex;    //方便多线程打印

void thread_func(const std::string& thread_name) {
    for (int i = 0; i < 3; ++i) {
        thread_local  int x = 1;  //只在每个线程创建时初始化一次
        x++;
        std::lock_guard<std::mutex> lock(_mutex);
        std::cout << "thread[" << thread_name << "]: x = " << x << std::endl;
    }
}

int main() {
    std::thread t1(thread_func, "1");
    std::thread t2(thread_func, "2");
    t1.join();
    t2.join();
    return 0;
}

打印结果为:

说明x仅在线程创建的时候初始化了一次。这个让我想到了static的局部变量 。

thread_local作为类的变量:

thread_local 作为类成员变量时必须是 static 。

#include <iostream>
#include <mutex>
#include <thread>
std::mutex _mutex;    //方便多线程打印


class B {
public:
    B() {
        std::lock_guard<std::mutex> lock(_mutex);
        std::cout << "create B" << std::endl;
    }
    ~B() {
        std::lock_guard<std::mutex> lock(_mutex);
        std::cout << "destroy B" << std::endl;
    }
    thread_local static int b_key;
    int b_value = 24;
    static int b_static;
};

thread_local int B::b_key = 12;

int B::b_static = 36;

void thread_func(const std::string& thread_name) {
    B b;
    for (int i = 0; i < 3; ++i) {
        b.b_key--;
        b.b_value--;
        B::b_static--;   // not thread safe
        std::lock_guard<std::mutex> lock(_mutex);
        std::cout << "thread[" << thread_name << "]: b_key:" << b.b_key << ", b_value:" << b.b_value << ", b_static:" << b.b_static << std::endl;
        std::cout << "thread[" << thread_name << "]: B::key:" << B::b_key << ", b_value:" << b.b_value << ", b_static: " << B::b_static << std::endl;
    }
    return;
}

int main() {
    std::thread t1(thread_func, "1");
    std::thread t2(thread_func, "2");
    t1.join();
    t2.join();
    return 0;
}

b_key的打印值和b_value,因为b_key是属于线程的,每个线程一份;而b_value是也是在类中定义的,每个线程一个类实例;但是b_static则是数据所有线程的;

打印结果如下:

参考博客:C/C++编程:thread_local 用法_c++ thread_local_OceanStar的学习笔记的博客-CSDN博客 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/756477.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2.我的第一个 JAVA 程序Helloword

对象&#xff1a;对象是类的一个实例&#xff0c;有状态和行为。例如&#xff0c;一条狗是一个对象&#xff0c;它的状态有&#xff1a;颜色、名字、品种&#xff1b;行为有&#xff1a;摇尾巴、叫、吃等。类&#xff1a;类是一个模板&#xff0c;它描述一类对象的行为和状态。…

前端videojs实现m3u8格式的直播

一、安装 npm install --save-dev video.js 二、引入 import videojs from "video.js"; import "video.js/dist/video-js.css"; 三、template 由于此处客户需要全屏至指定框大小&#xff0c;而不是全屏整个屏幕所以没用插件自带的全屏控件 隐藏自带全屏…

Unity 2DJoint 物理关节功能与总结

本文将以动图方式展示每个2D物理关节的效果&#xff0c;并解析部分重要参数的作用以及常见调配方式。 1.Distance Joint 2D&#xff08;距离关节&#xff09; 顾名思义是距离关节&#xff0c;以下为启用EnableCollision前后 关节使得两物体保持一定的距离&#xff0c;如果旋…

Apache (二十一)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、概述 二、安装 1. yum安装 2. 编译安装 三、 目录结构 1. yum安装 2. 编译安装 四、虚拟主机头配置 1. 基本配置 2. 实现方式 五、配置文件语法检查 六、 …

MySQL [环境配置]

MySQL [环境配置] MySQL的下载sqlyog的下载 熟悉老陈的人, 都清楚我不喜欢写这些环境配置的博客 那为啥这次要写一下MySQL的环境配置呢? 因为我被这一个小小的环境配置困扰了很长时间, 淋过雨的人都想为别人撑一把伞, 我不希望我的铁汁们也被这个问题困扰 MySQL的下载 MySQL下…

3. 测试 - 软件测试生命周期 BUG 的级别和生命周期

目录 1. 软件测试的生命周期 2. 描述 BUG 2.1 为什么要进行描述 2.2 如何描述一个 BUG 练习描述 BUG&#xff1a;邮箱登录不上去 练习描述 BUG&#xff1a;ie下界面显示异常&#xff0c;界面文字有重叠 3. BUG 的级别 4. BUG 的生命周期 1. 软件测试的生命周期 软件的…

【kubernetes系列】Kubernetes之Ingress

概述 从前面的学习&#xff0c;我们可以了解到Kubernetes暴露服务的方式目前常见的只有三种&#xff1a;LoadBlancer Service、NodePort Service、Ingress&#xff1b;而我们需要将集群内服务提供外界访问就会面临以下几个问题&#xff1a; Pod 漂移问题 Kubernetes 具有强大…

ubuntu 不能检测到显卡信息

开始时&#xff1a;lspci | grep -i nvidia 01:00.0 VGA compatible controller: NVIDIA Corporation Device 2489 (rev a1) 01:00.1 Audio device: NVIDIA Corporation Device 228b (rev a1) 运行sudo update-pciids 运行 lspci | grep -i nvidia 找到显卡了

Linux - 进阶 NFS服务器搭建 详解实验操作

建立 NFS 服务器&#xff0c;使用客户端成功访问 # 搭建环境 server 为服务端&#xff0c; node1 为客户端 &#xff08; 客户端是通过 服务端克隆出来的机子&#xff0c;并改了 IP 和 主机名&#xff09; IP 都显示出&#xff0c;并且双方能够 Ping 通 这样准备环…

顶尖公司是平均水平的100倍,惊讶吗?

行业顶尖公司人员平均能力水平&#xff0c;在行业平均水平的100倍之上&#xff01; 程序员的超级榜样&#xff1a;美国integram公司13个人&#xff0c;最后被facebook用10亿美金收购 《中庸》人能一之己百之&#xff0c;人能十之己千之 趣讲大白话&#xff1a;百倍努力&#xf…

项目管理软件挑选诀窍:6个必须知道的关键点!

项目管理软件对于任何希望简化其操作和提高效率的组织来说都是一个有价值的工具。然而&#xff0c;市场上有这么多的选择&#xff0c;选择合适的软件可能是一项艰巨的任务。在本文中&#xff0c;我们将讨论如何选择满足您业务需求的项目管理软件。 1、确定你的挑战和限制 选择项…

TL5000可调谐激光器控制软件系统

画了两周时间&#xff0c;利用下班时间&#xff0c;设计了一个ITLA可调谐激光器控制系统&#xff0c;从硬件到软件。 这是使用的界面&#xff0c;实现了下面的功能&#xff1a; 1、模块信息的读取&#xff0c;包括生产日期&#xff0c;生产厂家&#xff0c;型号&#xff0c;序…

在WIN10系统中安装TIA博途V18,重启后提示安装介质不可用,请插入DVD 或检查网络连接的解决办法

在WIN10系统中安装TIA博途V18,重启后提示安装介质不可用,请插入DVD 或检查网络连接的解决办法 原因:下载的安装包为ISO文件,若没有解压缩,直接点击打开安装,则会出现这样的错误提示。 解决办法: 把安装包解压缩之后再进行安装。 安装教程可参考以下步骤: 前提条件: T…

【iOS内存管理-编译链接的过程】

文章目录 前言计算机语言文件后缀名 编译和链接的过程编译链接预处理&#xff08;预编译&#xff09;-> 产生.i文件编译 -> 产生.s文件汇编 -> 产生.o文件链接 总结 前言 就我而言&#xff0c;iOS开发的过程中接触到的编译链接方面的知识很少&#xff0c;这部分知识还…

【JavaSE】- 包装类和String常用方法

包装类和常用方法 1.1 包装类1.2 自动装箱和自动拆箱1.3 包装类型转String类型2.1 String2.2 String常用方法3.1 StringBuffer4.1 StringBuilder 1.1 包装类 1.2 自动装箱和自动拆箱 // 手动装箱int n1 100;Integer integer new Integer(n1);// 手动拆箱Integer integer02 I…

electron globalShortcut 快捷键与系统全局快捷键冲突

用 electron 开发自己的接口测试工具&#xff08;Post Tools&#xff09;&#xff0c;在设置了 globalShortcut 快捷键后&#xff0c;发现应用中的快捷键与系统全局快捷键冲突了&#xff0c;导致系统快捷键不可正常使用。 快捷键配置 export function initGlobalShortcut(main…

20款奔驰E300升级柏林之声音响系统,体验不一样的感觉

享有盛名的 Burmester 音响系统可带来独特音质&#xff0c;打造震撼的听觉体验。高性能扬声器可营造殿堂级的立体声音响效果。您可以分别为前排和后排乘客优化这一设置&#xff0c;进一步提升听觉体验。

如何快速搭建自己同城跑腿系统?尚无忧跑腿小程序源码

是一款集代买、代送、代取等服务为一体的本地同城跑腿配送系统&#xff0c;支持二次开发&#xff0c;功能定制。 跑腿系统可众包模式&#xff0c;提供全套解决方案&#xff0c;包括跑腿系统配送端、用户端以及强大的后台管理系统。 使用uniappthinkphp技术 适配支持公众号APP…

【问卷分析】调节效应检验的操作②

文章目录 2.2 当调节变量是分类变量时&#xff08;1&#xff09; 确定组别区分&#xff08;2&#xff09;检验调节效应值&#xff08;3&#xff09;结果解读 接上一篇文章&#xff1a; 【问卷分析】调节效应检验的操作① 2.2 当调节变量是分类变量时 我们将以该模型中的调节变…

ASO优化之在海外如何进行竞品分析

进行竞争对手研究&#xff0c;需要分析当前的市场形势&#xff0c;确定竞争对手表现的模式&#xff0c;并将其应用到我们应用营销策略中。不同的应用可以在直观的用户界面上进行简单的比较&#xff0c;很容易看到长期趋势。 在App Store和Google Play上获取竞争对手评论区的信…