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

相关文章

重新对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. 环

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操