首页 > 其他分享 >golang 原子操作

golang 原子操作

时间:2023-11-22 21:35:07浏览次数:38  
标签:FP load val R2 原子 golang AX delta 操作

在 golang 中,有原子包,能够实现原子操作,在我分析和猜想下,感觉解开了谜团
具体用法不说了,网上一大堆什么 cas,add,load,store 等,主要是底层实现

arm 架构

在 amd 架构下,通过汇编指令加锁来实现

代码在src/runtime/internal/atomic/atomic_amd64.s

// uint64 Xadd64(uint64 volatile *val, int64 delta)
// Atomically:
//	*val += delta;
//	return *val;
TEXT ·Xadd64(SB), NOSPLIT, $0-24
	MOVQ	ptr+0(FP), BX
	MOVQ	delta+8(FP), AX
	MOVQ	AX, CX
	LOCK
	XADDQ	AX, 0(BX)
	ADDQ	CX, AX
	MOVQ	AX, ret+16(FP)
	RET

可以看到在执行 XADDQ 命令之前,先进行 LOCK 加锁把内存地址锁住,然后执行下面的操作

amd 架构

在 arm 架构下,似乎没看到 LOCK 指令

src/runtime/internal/atomic/atomic_arm64.s

// uint64 Xadd64(uint64 volatile *ptr, int64 delta)
// Atomically:
//      *val += delta;
//      return *val;
TEXT ·Xadd64(SB), NOSPLIT, $0-24
	MOVD	ptr+0(FP), R0
	MOVD	delta+8(FP), R1
	MOVBU	internal∕cpu·ARM64+const_offsetARM64HasATOMICS(SB), R4
	CBZ 	R4, load_store_loop
	LDADDALD	R1, (R0), R2
	ADD 	R1, R2
	MOVD	R2, ret+16(FP)
	RET
load_store_loop:
	LDAXR	(R0), R2
	ADD	R2, R1, R2
	STLXR	R2, (R0), R3
	CBNZ	R3, load_store_loop
	MOVD	R2, ret+16(FP)
	RET

在 arm 架构下没有了 LOCK 指令,但是用到了 MOVBU internal∕cpu·ARM64+const_offsetARM64HasATOMICS(SB), R4 这个命令,虽然没查到怎么用,但是看变量命令,可以理解是将原子位置一个值再操作

参考

原子操作与 x86 上的 lock 指令前缀

标签:FP,load,val,R2,原子,golang,AX,delta,操作
From: https://www.cnblogs.com/elve960520/p/17850347.html

相关文章

  • golang select
    golangselect是多channel并行的利器不要拿switch和select比,根本不是一个东西好嘛,差不少,只是名字稍微有点像前置操作golang对select做了一些优化select结构体为空当select里面为空的时候会直接panic只有一个case当只有一个case时候(包括只有一个case时候),......
  • 数据类型及其操作
    Task03:数据类型和操作DataTypesandOperators数据类型1,整数Intger(int)2,浮点数Float3,布尔值Boolean(bool)4,类型Type("Type也是·一种类型")严格的来说,Type是一种类的对象,python是一门“面向对象友好”的语言print(type(2))<class'int'>print(type(2.2))<class'float......
  • C/C++ 实现Windows注册表操作
    Windows注册表(Registry)是Windows操作系统中用于存储系统配置信息、用户设置和应用程序数据的一个集中式数据库。它是一个层次结构的数据库,由键(Key)和值(Value)组成,这些键和值被用于存储各种系统和应用程序的配置信息。以下是注册表的一些基本概念:键(Key):注册表中的数据结构,类似于文......
  • COMP 340 操作系统 Bounded Buffer问题解决
    这里有3个发生器,每个发生器独立地产生一种独特的材料。所有这些材料在被转发给操作员之前被存储在大小为10的输入缓冲器中。我们有三个具有相同优先级的运营商,他们负责生产基于这些材料。每种产品需要2种不同的材料。每次操作员需要2个用于此目的的工具。总共为这些操作员提供了3......
  • Golang Gin 模板基本使用
    一,模板定义,模板变量,条件判断,模板函数,模板命名1{{define"default/index.html"}}2<!DOCTYPEhtml>3<htmllang="en">45<head>6<metacharset="UTF-8">7<metaname="viewport"conte......
  • android studio 添加按钮事件实现加一操作
    androidstudio添加按钮事件实现加一操作要在AndroidStudio中为按钮添加一个加一(+1)的操作,你可按照下列步骤实现:通过在XML布局中添加按钮,导入一个Button组件: XML复制代码<Buttonandroid:id="@+id/add_button"android:layout_width="wrap_content"andro......
  • 【操作系统】磁盘克隆/系统迁移的奔溃总结
    在最近的计算机维护过程中,发现leader的电脑过于老旧,硬盘出现问题,为了保护数据安全,这边也是建议leader更换新的主机leader一听到,卧槽会丢数据,果断同意。接下来就开启我崩溃的一天。【操作系统】磁盘克隆/系统迁移的奔溃总结1.磁盘克隆由于新的主机是品牌机,考虑到保修等等问题,......
  • python tkinter treeview 操作示例
    1.建立Treeviewfromtkinterimport*fromtkinter.ttkimport*root=Tk()#建立Treeviewcolumns=(('ID',50),('S_ID',50),('S_NAME',120),('B_NAME',120),('Date_Taken',100),......
  • sqlalchemy快速使用,sqlalchemy原生操作,sqlalchemy操作表,一对多关系,多对多关系,scoped线
    1sqlalchemy快速使用......
  • 队列存放用户请求,执行耗时操作的解决方案
    队列存放用户请求的实现方案直接上图待补充……......