C++11多线程:原子操作std::automic-用于多个线程之间共享的变量。

news2025/1/21 12:10:43

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、std::automic
  • 二、使用步骤
    • 1.代码案例
  • 总结


前言

原子操作std::automic的基本概念和用法。


一、std::automic

std::atomic来代表原子操作,std::automic是个类模板。其实std::atomic这个东西是用来封装某个类型的值的。
1.1 原子操作概念引出范例

互斥量:多线程编程中 保护共享数据:先锁,操作共享数据,开锁

有两个线程,对一个变量进行操作,这个线程读该变量值,另一个线程往这个变量中写值。
int atomvalue = 5//读线程A
int tmpvalue = atomvalue;
//这里这个atomvalue代表的是多个线程之间共享的变量;
//写线程B
atomvalue = 6;

1.2 汇编代码的话;
大家可以把原子操作理解成一种:不需要用到互斥量加锁(无锁)技术的多线程并发编程方式

  • 原子操作:在多线程中 不会被打断的 程序执行片段;原子操作,比互斥量效率上更胜一筹。
  • 互斥量的加锁一般是针对一个代码段(几行代码),而原子操作针对的一般是一个变量,而不是一个代码段;
  • 原子操作:一般都是指“不可分割的操作”;也就是说这种操作状态要么是完成的,要么是没完成的,不可能出现半完成状态;

二、使用步骤

1.代码案例

代码如下(示例):


//int g_mycout = 0; //定义一个全局变量
std::atomic<int> g_mycout = 0; //我们封装了一个类型为int的对象(值);我们可以像操作一个int类型变量一样来操作这个g_mycout

//std::mutex g_my_mutex; //互斥量

void mythread03() //线程入口函数
{
	for (int i = 0; i < 100000; i++)
	{
		//g_my_mutex.lock();
		//7秒钟实现了2000万次的加锁和解锁;
		//g_mycout++;
		//...
		//...
		//g_my_mutex.unlock();
		
		g_mycout++;
		
		//cout <<""
		//对应的操作是原子操作(不会被打断)
	}
	
	
	return;
}

int main()
{
	//三:原子操作std::automic
	//(3.1)原子操作概念引出范例
	//互斥量:多线程编程中 保护共享数据:先锁,操作共享数据,开锁
	//有两个线程,对一个变量进行操作,这个线程读该变量值,另一个线程往这个变量中写值。
	//int atomvalue = 5;
	读线程A
	//int tmpvalue = atomvalue;
	//这里这个atomvalue代表的是多个线程之间共享的变量;
	写线程B
	//atomvalue = 6;
	//汇编代码的话;

	//大家可以把原子操作理解成一种:不需要用到互斥量加锁(无锁)技术的多线程并发编程方式
	//原子操作:在多线程中 不会被打断的 程序执行片段;原子操作,比互斥量效率上更胜一筹。
	//互斥量的加锁一般是针对一个代码段(几行代码),而原子操作针对的一般是一个变量,而不是一个代码段;

	//原子操作:一般都是指“不可分割的操作”;也就是说这种操作状态要么是完成的,要么是没完成的,不可能出现半完成状态;
	//std::atomic来代表原子操作,std::automic是个类模板。其实std::atomic这个东西是用来封装某个类型的值的;
	//(3.2)基本的std::atomic

	std::thread myobj1(mythread03);
	std::thread myobj2(mythread03);
	cout << "线程开始!" << g_mycout<< endl;
	myobj1.join();
	cout << "thread_myobj1 end!" << g_mycout << endl;
	myobj2.join();
	cout << "thread_myobj2 end!" << g_mycout << endl;

	cout << "两个线程执行完毕,最终的g_mycout的结果是:" << g_mycout << endl;

	return 0;
}

运行截图:
在这里插入图片描述


总结

  • 了解std::automic的基本概念和使用;
  • 了解与互斥量的区别;
  • 什么是原子操作?

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

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

相关文章

常用 Composition API--ref函数

ref函数--处理基本类型 以前我们的ref属性用处主要用于打标识&#xff0c;像原生js中的id标签一样。我们可以通过这个ref函数可以实现获取input元素&#xff0c;并让他获取焦点触发事件 而在v3中的是ref函数 先提出一个例子&#xff0c;我点击一个按钮&#xff0c;但是页面并…

WordCount 在 MapReduce上运行详细步骤

注意&#xff1a;前提条件hadoop已经安装成功&#xff0c;并且正常启动。 1.准备好eclipse安装包&#xff0c;eclipse-jee-juno-linux-gtk-x86_64.tar.gz&#xff0c;使用SSH Secure File Transfer Client工具把安装包上传于Hadoop集群的名称节点。 2.上传Hadoop在eclipse上运…

C++缺省参数的具体使用

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C之路】 本文来详细介绍C中的缺省参数。正文开始&#xff1a; 目录 一、缺省参数概念二、缺省参数分类2.1全缺省2.2半缺省 三、缺省参数…

Linux上搭建Discuz论坛

一.准备工作 1.下载php*&#xff0c;mariadb-server 2.上传Discuz3.5压缩包并解压 二.搭建过程 基于redhat 9 版本和Discuz3.5&#xff0c;php8.0&#xff0c;mariadb10.5演示 一.准备工作 1.下载php*&#xff0c;mariadb-server [rootredhat9 aaa]# yum install -y php*…

300元的蓝牙耳机什么牌子好?300内无线蓝牙耳机推荐

感受过无线的自在舒适后&#xff0c;越来越多的小伙伴爱上了蓝牙耳机白天出街更潇洒&#xff0c;目前市面上蓝牙耳机琳琅满目可选择性较多价格从几十、几百元到数千元不等然而蓝牙耳机的安全性、舒适性如何&#xff1f;连接稳吗&#xff1f;下面整理了几款300元价位的耳机分享给…

前端配置项

默认下载安装所需插件的时候会自动添加配置&#xff0c;但有时候可能需要自己去配&#xff0c;比如系统重装&#xff08;重装的是C盘&#xff0c;系统变量会丢失&#xff0c;软件在其他盘符并不需要重新下载&#xff09;。 前端开发涉及到需要配置变量的软件有&#xff1a;git…

JVM之GC日志解读

通过阅读Gc日志&#xff0c;我们可以了解Java虚拟机内存分配与回收策略。 内存分配与垃圾回收的参数列表 -XX:PrintGC 输出GC日志。类似&#xff1a;-verbose:gc -XX:PrintGCDetails 输出GC的详细日志 -XX:PrintGCTimestamps 输出GC的时间戳&#xff08;以基准时间的形式&#…

如何进行帕累托分析

【面试题】有一张“学生成绩表”&#xff0c;包含3个字段&#xff1a;学号、课程、成绩。 问题&#xff1a;找出每门课程A类和B类的学生&#xff0c;判断标准是累计占比&#xff0c;0~60%的记为A类&#xff0c;60%~85%记为B类 【解题思路】 什么是二八定律&#xff1f; 二八定律…

Java通过显示弹奏音乐的方式来实现继承的有关方法

目录 前言 一、Music.java类 1.1运行流程&#xff08;思想&#xff09; 1.2代码段 二、Brass.java类 1.1运行流程&#xff08;思想&#xff09; 1.2代码段 三、Wind.java类 1.1运行流程&#xff08;思想&#xff09; 1.2代码段 四、Instrument.java类 1.1运行流程&…

世界领先的电动汽车国际标准 一 ISO 15118全系列

世界领先的电动汽车国际标准 一 ISO 15118全系列 ISO 15118 的官方名称是“道路车辆——车辆到电网的通信接口”。我可能有点偏见&#xff0c;因为我是该国际标准的共同作者之一&#xff0c;但我坚信 ISO 15118 是当今可用的最重要和面向未来的标准之一。 ISO 15118 中内置的…

C语言学习分享(第三次)------了解C语言-下

了解C语言-下 前言知识列表1. 函数1.1认识函数1.2 自己实现函数1.3 注意事项以及函数的好处 2. 数组2.1 认识数组2.2 数组的下标 3. 操作符3.1 算数操作符3.2 移位操作符和位操作符3.3 赋值操作符3.4 单目操作符3.5 关系操作符3.6 条件操作符3.7 逗号表达式 4. 常见关键字4.1 关…

开源正当时,共赢新未来 OpenHarmony开发者大会成功召开

4月19日&#xff0c;以“开源正当时&#xff0c;共赢新未来”为主题的开放原子开源基金会OpenHarmony开发者大会2023&#xff08;以下简称“大会”&#xff09;成功举办。 本次大会由开放原子开源基金会指导&#xff0c;OpenHarmony项目群工作委员会主办&#xff0c;华为、开鸿…

Windows逆向安全(一)之基础知识(九)

汇编比较三种循环 众所周知&#xff0c;在C语言可以使用可以使用三种循环&#xff0c;分别是&#xff1a;while、do…while和for 本文从汇编的角度出发&#xff0c;观察这三种循环的差异 范例代码 先贴出三种循环的代码&#xff0c;分别用这三种循环计算 0123456789&#…

【PyTorch】第三节:反向传播算法

作者&#x1f575;️‍♂️&#xff1a;让机器理解语言か 专栏&#x1f387;&#xff1a;PyTorch 描述&#x1f3a8;&#xff1a;PyTorch 是一个基于 Torch 的 Python 开源机器学习库。 寄语&#x1f493;&#xff1a;&#x1f43e;没有白走的路&#xff0c;每一步都算数&#…

SpringBoot高校毕业生就业信息管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBoot框架开发的高校毕业生就业信息管理系统项目。首先&#xff0c;这是一个响应式的项目&#xff0c;代码…

五:用户空间内存分配

目录 用户空间内存分配 mmap malloc 用户空间内存分配 mmap 将内核空间直接映射到用户空间&#xff0c;省去从内核到用户空间的内存拷贝。 mmap的缺点 mmap 使用时必须实现指定好内存映射的大小&#xff0c;因此 mmap 并不适合变长文件&#xff1b;mmap如果更新文件的操作…

【通过Cpython3.9源码看看python字符串的缓存机制】

基本说明 在CPython中&#xff0c;字符串intern机制是一种字符串对象缓存机制&#xff0c;用于避免创建多个相同内容的字符串对象&#xff0c;以减少内存使用。具体来说&#xff0c;如果两个字符串对象的内容相同&#xff0c;那么这两个字符串对象实际上会共享同一块内存空间。…

【Vue基础】前端工程化Vue项目

一、创建Vue项目步骤 1、新建一个文件夹&#xff0c;起名为vue_project01 2、在该文件夹中打开cmd&#xff0c;输入指令vue ui&#xff0c;打开图形化界面 3、此时跳转到网页&#xff0c;根据以下步骤配置vue项目 1&#xff09;项目名命名为test01&#xff1b;选择包管理器为…

使用R语言进行方差分析(ANOVA、ANCOVA)(一)

方差分析&#xff08;一&#xff09; 1. ANOVA模型拟合1.1 aov()函数1.2 表达式中各项的顺序 2. 单因素方差分析&#xff08;One-Way ANOVA&#xff09;2.1 绘制各组均值及其置信区间的图形2.2 多重比较-TukeyHSD2.2.1 成对比较图2.2.2 多重均值比较-TukeyHSD&#xff08;更易理…

图的存储(邻接矩阵邻接表)

图的存储 文章目录 图的存储1 邻接矩阵1.1 邻接矩阵存储结构定义1.2 完整代码应用 2 邻接表2.1 邻接表存储结构定义2.2 完整代码应用 1 邻接矩阵 A [ i ] [ j ] 1 A[i][j]1 A[i][j]1 表示顶点i与顶点j邻接&#xff0c;即i与j之间存在边或者弧。 A [ i ] [ j ] 0 A[i][j]0 A…