x86 平台实现一个原子加法操作

server/2024/10/11 13:28:27/

1,先上代码

#include <iostream>
#include <omp.h>int atomicAdd(int* ptr, int value) {int result;asm volatile("lock xaddl %0, %1\n": "=r" (result), "=m" (*ptr): "0" (value), "m" (*ptr): "memory");return result;
}int main() {int sharedValue = 0;// 原子加法操作
//    int increment = 10;
#pragma omp parallel
{for(int i=0; i<10000; i++)atomicAdd(&sharedValue, 10);//atomicAdd(&sharedValue, increment);
}std::cout << "New value: " << sharedValue << std::endl;return 0;
}

Makefile:


EXE := hello_atomic
all: $(EXE)%: %.cppg++ -fopenmp $< -o $@.PHONY: clean
clean:-rm -rf $(EXE)

2,实验运行效果

18核36线程,每个线程做1W次加法,没有加丢:

3,原理

        在 x86 架构的 CPU 中,原子操作通常是通过特殊的 CPU 指令来实现的,这些指令能够确保在多线程并发执行时,线程或进程使用这类指令对共享内存的操作是原子的,即不会被中断或打断。以下是一些常见的 x86 CPU 中用于实现原子操作的指令:


1. XCHG 指令:XCHG 指令用于交换内存中的值和寄存器中的值。在多线程编程中,可以使用 XCHG 指令来实现原子的读-修改-写操作。


2. CMPXCHG 指令:CMPXCHG 指令用于比较首操作数与 XAX的值,如果相等则将第二操作数的值复制给首操作数。这个指令通常用于实现原子的比较并交换操作(Compare and Swap)。


3. LOCK 前缀:LOCK 前缀可以与其他指令一起使用,用于将指令执行过程中的内存访问变为原子操作。例如,LOCK XCHG 或 LOCK CMPXCHG。


4. 内存屏障指令:MFENCE、SFENCE 和 LFENCE 指令用于确保内存操作的顺序性和可见性,以避免乱序执行带来的问题。


这些指令和前缀可以确保在多线程并发执行时,对共享内存的操作是原子的,从而避免竞态条件和数据不一致性问题。在编写并发程序时,可以利用这些原子操作来实现线程安全的共享内存访问。


http://www.ppmy.cn/server/53329.html

相关文章

react中如何获取并使用usestate声明的变量的值

1. 函数式更新 当需要根据当前状态来更新状态时&#xff0c;可以使用函数式更新。setState&#xff08;在类组件中&#xff09;和setCount&#xff08;在useState中&#xff09;都可以接受一个函数作为参数&#xff0c;这个函数接收当前的状态作为参数&#xff0c;并返回新的状…

计算机网络:应用层 - 万维网 HTTP协议

计算机网络&#xff1a;应用层 - 万维网 & HTTP协议 万维网 WWW统一资源定位符 URL 超文本传输协议 HTTP非持续连接持续连接非流水线流水线 代理服务器HTTP报文 万维网 WWW 万维网是一个大规模的、联机式的信息储藏所。万维网用链接的方法能非常方便地从互联网上的一个站点…

【教程】几种不同的RBF神经网络

本站原创文章&#xff0c;转载请说明来自《老饼讲解-机器学习》www.bbbdata.com 目录 一、经典RBF神经网络1.1.经典径向基神经网络是什么1.2.经典径向基神经网络-代码与示例 二、广义回归神经网络GRNN2.1.广义回归神经网络是什么2.2.广义回归神经网络是什么-代码与示例 三、概率…

AI学习指南机器学习篇-高斯朴素贝叶斯算法简介

AI学习指南机器学习篇-高斯朴素贝叶斯算法简介 高斯朴素贝叶斯算法的原理 算法的基本思想 高斯朴素贝叶斯算法是贝叶斯分类器的一种&#xff0c;其基本思想是通过计算输入特征对于每个类别的概率&#xff0c;然后选择具有最高概率的类别作为最终的分类结果。其“朴素”之处在…

探索未来的AI革命:GPT-5的即将登场

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

【Linux】动/静态库的创建和使用

目录 一、动/静态库的概念回顾&#xff1a; 二、动态库与静态库的区别&#xff1a; 三、静态库的创建与使用&#xff1a; 1、Linux静态库命名规则&#xff1a; 2、静态库的创建和使用&#xff1a; 四、动态库的创建与使用&#xff1a; 1、Linux动态库命名规则&#xff1…

项目启动 | 盘古信息助力鼎阳科技开启智能制造升级新征程

在全球数字化浪潮不断涌动的背景下&#xff0c;电子信息行业正迎来转型升级的关键阶段。近日&#xff0c;盘古信息与深圳市鼎阳科技股份有限公司&#xff08;简称“鼎阳科技”&#xff0c;股票代码&#xff1a;688112&#xff09;正式启动了IMS数字化智能制造工厂项目&#xff…

Pinia详解

文章目录 简介特点用法1. 安装Pinia2. 注册Pinia Store3. 创建Pinia Store4. 使用Pinia Store 区别 Vuex详解 Pinia是一个基于Vue 3的状态管理库&#xff0c;专为Vue 3设计。它提供了一种简单、直观且可扩展的方式来组织和访问应用程序的状态。Pinia的设计灵感来源于Vuex&#…