C++语法|thread_local详解

文章内容全部来自:
【C++入门到进阶 多线程 thread_local 关键字】
【CPU眼里的:thread_local】

简介

thread_local 是一个关键字,它用来修饰变量,并被他修饰的变量有以下特征:

  • 它指示对象拥有线程静态存储期
    • 线程存储期:对象的存储在线程开始时分配,而在线程结束时析构。每个线程拥有其自身的对象实例。 thread_local 能与 static 和 extern 一同出现,以调整链接。
  • 它具有 static 修饰的变量一样的初始化特征和生命周期
    • 也就是说它的初始化只进行一次
  • 需要注意的是他在单独修饰类成员变量时,必须加上 static

测试线程存储周期和类static特性

我们构建这样的测试代码:

class A
{
public:A() {cout << __FUNCTION__ << endl;}~A() {cout << __FUNCTION__ << endl;}int v = 0;void add () {//static int v = 0;cout << std::this_thread::get_id() << " "<< ++v << endl;cout.flush();}
};thread_local A a;int main () {a;return 0;
}

对于我们在main()函数外面初始化类A,我们可以看到只构造了一个A类。

随后我们更改测试代码:

thread_local A a;void threadFunc() {a.add();
}int main () {thread t1(threadFunc);thread t2(threadFunc);t1.join();t2.join();a.add();return 0;
}

可以看到结果我们一共构造了3个A实例,并且都完成析构。

这就是我们的线程静态存储期。

测试 修饰类成员变量加上static

如果你在修饰成员变量的时候,不加static会直接报错。

class A
{
public:A() {cout << __FUNCTION__ << endl;}~A() {cout << __FUNCTION__ << endl;}thread_local inline static int v = 0;void add () {//static int v = 0;cout << std::this_thread::get_id() << " "<< ++v << endl;cout.flush();}
};

随后我们来验证该类成员变量 v 的线程存储周期:
我们创建了两个子线程,然后再子线程中调用 add() ,也就是让 v自增,并且我们在主线程中也调用 add() ,让 v 自增。按照前面的理论我们应该能得出:三个v的打印必须全部是1:

A a;void threadFunc() {// 每个线程第一次访问 thread_local 变量 a 时,都会调用构造函数a.add();
}
int main () {thread t1(threadFunc);thread t2(threadFunc);t1.join();t2.join();a.add();return 0;
}
//结果如下
// A
// 140127114585664 1
// 140127122978368 1
// 140127122982720 1
// ~A

我们可以看到,A变量全局只有一个被存储在 .data段,被各个线程共享。然后我们开始让v完成自增操作,我们可以看到v打印出来都是1,说明该类的成员变量 v 每个线程都有且仅有一个。

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

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

相关文章

高效编写大模型 Prompt 提示词,解锁 AI 无限创意潜能

随着 ChatGPT 的出现&#xff0c;AI 成为新的焦点&#xff0c;有人说过“未来 50%的工作将是提示词工作”&#xff0c;目前很多公司也在开始招聘 Prompt 提示词工程师。Prompt&#xff08;提示词&#xff09;成为了连接创意与技术的桥梁&#xff0c;它不仅是简单的指令&#xf…

2024年第七届管理、经济和社会科学国际会议(ICMESS 2024)

2024年第七届管理、经济和社会科学国际会议(ICMESS 2024) 会议简介 2024年第七届管理、经济和社会科学国际会议&#xff08;ICMESS 2024&#xff09;将为“管理、经济与社会发展”等最新研究领域的研究人员、专家、学者和行业专家提供一个平台&#xff0c;介绍他们的最新研究…

调试记录-RK平台用指令开启ADB功能

需求 嵌入式Linux系统调试过程中&#xff0c;为了方便&#xff0c;我们会借鉴Android调试的方法&#xff0c;在Linux系统添加adb功能&#xff0c;主要功能是通过USB线连接开发板和PC&#xff0c;实现两者之间传输文件&#xff0c;在PC上执行指令操作开发板。 实现 前提&…

【杂记-DNS服务器中的SOA、NS、PTR、A记录】

1、SOA&#xff1a;SOA记录&#xff0c;即起始授权机构记录&#xff0c;SOA记录表明了DNS服务器之间的关系&#xff0c;并表明了谁是这个区域的所有者。常见的DNS服务器只能创建一个标准区域&#xff0c;然后可以创建很多个辅助区域。标准区域是可以读写修改的。而辅助区域只能…

一个简单的TCP socket通讯的实现

这个示例代码包含了一个简单的TCP socket通讯的实现。其中包括一个服务器端和一个客户端&#xff0c;服务器端监听指定端口&#xff0c;接受连接并读取客户端发送的数据&#xff0c;然后向客户端发送响应&#xff1b;客户端连接到服务器端&#xff0c;发送数据并接收服务器端的…

Python OCR 文字检测使用模型:读光-文字检测-DBNet行检测模型-中英-通用领域

介绍 什么是OCR&#xff1f; OCR是“Optical Character Recognition”的缩写&#xff0c;中文意为“光学字符识别”。它是一种技术&#xff0c;可以识别和转换打印在纸张或图像上的文字和字符为机器可处理的格式&#xff0c;如计算机文本文件。通过使用OCR技术&#xff0c;可…

Vue:快速上手

一、简介 Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界面&#xff0c;…

MyBatisPlus实现多表查询

前言 在现代Web开发中,数据操作层的高效与灵活至关重要。MyBatisPlus(简称MP)作为MyBatis的增强工具,凭借其简洁的API设计和丰富的功能,极大地简化了数据库操作,尤其是在处理复杂查询如多表关联查询时展现出了独特的优势。本文将通过一个实际案例——使用MyBatisPlus实现…

信息化教推动数字化学校建设

在数字化学校建造的过程中&#xff0c;许多学校都疏忽了运用这些网络科技渠道的教师和学生&#xff0c;一味的追求学校数字化、智能化建造&#xff0c;没有从根本上意识到教育信息化的出现者或者说体现者的重要性&#xff0c;因而&#xff0c;建造数字化学校&#xff0c;前进教…

微服务架构-聚合设计模式

微服务架构-聚合设计模式 聚合器&#xff08;Aggregator&#xff09;设计模式&#xff1a;用于将来自多个微服务的数据&#xff0c;聚合成一个统一的响应&#xff0c;提供给客户端。 聚合模式的核心思想&#xff1a;是使用一个聚合器服务&#xff08;Aggregator Service&#…

全面剖析UNIX网络编程的五种I/O模式

在Linux系统中&#xff0c;内核将所有外部设备都视为文件来操作。对一个文件的读写操作会调用内核提供的系统命令&#xff0c;并返回一个文件描述符&#xff08;file descriptor&#xff0c;简称fd&#xff09;。同样地&#xff0c;对一个套接字的读写操作也有对应的描述符&…

你对仲裁裁决不服怎么办?我教你四个狠招!

你对仲裁裁决不服怎么办&#xff1f;我教你四个狠招&#xff01; 这个标题是什么意思呢&#xff1f;也就是说&#xff0c;当你&#xff08;或用人单位&#xff09;向劳动仲裁委提出仲裁申请后&#xff0c;但劳动仲裁结果没有维护你的权益&#xff0c;或者你不满意&#xff0c;…

[STM32+HAL]LD-1501MG舵机二次开发指南

一、准备材料 核心板&#xff1a;STM32F407ZGT6 舵机&#xff1a;LD-1501MG数字舵机 控制器&#xff1a;24路PWM舵机控制器 二、HAL库配置 开启串口与控制器通信 三、Keil填写代码 1、Servo.c #include "Servo.h" #include "usart.h"uint8_t Message…

python内存马学习

python内存马学习 python内存马学习 python内存马学习环境搭建和复现分析payloadFlask 请求上下文管理机制bypass高版本flask内存马的利用before_request**after_request** teardown_requesterrorhandler相关例题H&NCTF 2024 ezFlask python内存马 环境搭建和复现 from fl…

离大模型落地应用最近的工程化技术(RAG)

虽然大规模语言模型&#xff08;LLM&#xff09;在自然语言处理&#xff08;NLP&#xff09;方面表现出了其强大的文本生成和理解能力&#xff0c;但是它们在实际应用中仍然面临一些挑战&#xff0c;如处理大规模知识库和实时获取最新信息的能力&#xff0c;并且会产生幻觉。为…

Flutter 中的 ColoredBox 小部件:全面指南

Flutter 中的 ColoredBox 小部件&#xff1a;全面指南 在 Flutter 的世界中&#xff0c;ColoredBox 是一个用于填充颜色的简单而强大的小部件。它是一个不透明的矩形&#xff0c;可以用来创建颜色块&#xff0c;作为布局的占位符&#xff0c;或者简单地改变某个区域的背景色。…

「代码厨房大揭秘:Python性能优化的烹饪秘籍!」

哈喽&#xff0c;我是阿佑&#xff0c;上篇咱们讲了 Socket 编程 —— 探索Python Socket编程&#xff0c;赋予你的网络应用隐形斗篷般的超能力&#xff01;从基础到实战&#xff0c;构建安全的聊天室和HTTP服务器&#xff0c;成为网络世界的守护者。加入我们&#xff0c;一起揭…

Java中数字里面混合有下划线10_000 代表什么意思?

public static void main(String[] args) {int a 10_000;System.out.println(a); // 10000} java 7 的 特性 &#xff1a; https://docs.oracle.com/javase/7/docs/technotes/guides/language/underscores-literals.html 程序中的数字可以使用下划线来进行分割&#xff08;_…

区块链系统开发测试----链码部署开发、系统开发验证

一.检查配置环境 检查虚拟机环境&#xff0c;确保有正在运行的Hyperledger Fabric区块链&#xff0c;并且其中chaincode_basic、credit_chaincode链码可以正常调用 查看chaincode_basic、credit_chaincode链码调用 二.开发征信链码代码 基于现有征信链码&#xff0c;开发征信…

Niantic利用Meta Llama让数字生物栩栩如生

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…