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

相关文章

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 基本操

c++中std::placeholders的使用方法

《c++中std::placeholders的使用方法》std::placeholders是C++标准库中的一个工具,用于在函数对象绑定时创建占位符,本文就来详细的介绍一下,具有一定的参考价值,感兴... 目录1. 基本概念2. 使用场景3. 示例示例 1:部分参数绑定示例 2:参数重排序4. 注意事项5.

基于Java实现模板填充Word

《基于Java实现模板填充Word》这篇文章主要为大家详细介绍了如何用Java实现按产品经理提供的Word模板填充数据,并以word或pdf形式导出,有需要的小伙伴可以参考一下... Java实现按模板填充wor编程d本文讲解的需求是:我们需要把数据库中的某些数据按照 产品经理提供的 word模板,把数据

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06