std::atomic类模板的学习(1)

2024-04-13 12:20
文章标签 模板 学习 std atomic

本文主要是介绍std::atomic类模板的学习(1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.引言

      std::atomic是一个c++的模板类,为了解决线程访问共享资源时出现数据竞争问题。atomic的翻译成中文的意思是原子的,这里指的就是原子操作的意思。什么是原子操作呢?看到一个代码示例讲的挺好的。

int value = 0;
void atomic_function() {for (int i = 0; i < 100; ++i)value += 1;
}

       我们在线程A里面调用以上atomic_function函数时,我们在线程B里观察value的结果。如果是原子操作,那么观察的value值要么是0,要么是100;如果是非原子操作,value的值被观测时,可能是0~100的任何一个整数值。示例中函数不加特殊处理,肯定不是原子操作,只是拿来理解原子操作的概念。

2. 基本信息

头文件
#include< <atomic>

类型定义
template< class T >
struct atomic;

3.对于整数类型的示例化

std::atomic模板类可对以下整数类型进行实例化

字符类型:
char
char8_t (C++20) 
char16_t  
char32_t
wchar_t

标准有符号整数类型: 
signed char
short 
int
long
long long

标准无符号整数类型: 
unsigned char
unsigned short
unsigned int
unsigned long
unsigned long long

std::atomic模板类对以上整数类型的实例化对象提供原子操作,例如 

fetch_add
fetch_sub 
fetch_and  
fetch_or  
fetch_xor 

4  std::atomic<int>的原子操作fetch_add使用demo

fetch_add的函数原型

T fetch_add
(T arg, std::memory_order order = std::memory_order_seq_cst 
);

参数
arg - 算术加法的另一参数 
order - 强制的内存顺序制约,默认情况下为std::memory_order_seq_cst 。

内存顺序制约比较难理解,初学暂且放下。接下来看fetch_add的使用案例。文件名:atomic.c

#include<iostream>
#include<thread>
#include<atomic>std::atomic<int> atomic_data;void AtomicAdd(void)
{for(int i = 0; i < 1000000; i++){atomic_data.fetch_add(1);}   
}int main(int argn, char* argv[])
{std::cout << "hello atomic fetch_add" << std::endl;std::thread th1(AtomicAdd);std::thread th2(AtomicAdd);std::thread th3(AtomicAdd);th1.join();th2.join();th3.join();std::cout << "atomic_data Val:" << atomic_data << std::endl;return 0;
}

同目录下写一个简单的Makefile,省的每次都写g++编译语句,如下:

TGT := main
SRC := atomic.c
OPTION := -I.
OPTION += -pthreadall: $(TGT)@echo "make sucessfull"$(TGT):$(SRC)g++ -std=c++11 $^ $(OPTION) -o $@clean:rm $(TGT)
.PHONY: all clean

编译后,运行结果如下:

hello atomic fetch_add
atomic_data Val:3000000

这篇关于std::atomic类模板的学习(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/900123

相关文章

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

SpringBoot集成EasyPoi实现Excel模板导出成PDF文件

《SpringBoot集成EasyPoi实现Excel模板导出成PDF文件》在日常工作中,我们经常需要将数据导出成Excel表格或PDF文件,本文将介绍如何在SpringBoot项目中集成EasyPo... 目录前言摘要简介源代码解析应用场景案例优缺点分析类代码方法介绍测试用例小结前言在日常工作中,我们经

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

Java如何根据word模板导出数据

《Java如何根据word模板导出数据》这篇文章主要为大家详细介绍了Java如何实现根据word模板导出数据,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... pom.XML文件导入依赖 <dependency> <groupId>cn.afterturn</groupId>

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Python中Flask模板的使用与高级技巧详解

《Python中Flask模板的使用与高级技巧详解》在Web开发中,直接将HTML代码写在Python文件中会导致诸多问题,Flask内置了Jinja2模板引擎,完美解决了这些问题,下面我们就来看看F... 目录一、模板渲染基础1.1 为什么需要模板引擎1.2 第一个模板渲染示例1.3 模板渲染原理二、模板

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环