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实现模板填充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

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n