首页 > 其他分享 >atomic.LoadInt64

atomic.LoadInt64

时间:2024-03-30 15:45:27浏览次数:23  
标签:LoadInt64 源码 atomic SB go AX

atomic.LoadInt64

源码

在经历了之前查看AddInt64​的经历后, 我们可以确定LoadInt64​的代码位置

TEXT runtime∕internal∕atomic·Loadint64(SB), NOSPLIT, $0-16
	JMP	runtime∕internal∕atomic·Load64(SB)

我们看到, 其实是直接调用runtime∕internal∕atomic·Load64​这个函数, 我们再去看看它的实现吧.

TEXT	sync∕atomic·LoadInt64(SB), NOSPLIT|NOFRAME, $0-16
	GO_ARGS
	MOVQ	$__tsan_go_atomic64_load(SB), AX
	CALL	racecallatomic<>(SB)
	RET

这里的实现还是非常简单的, 将__tsan_go_atomic64_load​移动至AX​寄存器, 调用该函数, 并返回.

这里的__tsan_go_atomic64_load​还是对我们隐藏了细节, 我们还是编译后来看看源码吧

汇编分析

源码

image

分析

黄色部分是LoadInt64​的实际代码

  1. 将地址移动到AX​寄存器中
  2. 解引用(AX) -> AX​, 需要注意的是: 在汇编语言中 如果在寄存器或者地址外有一个()​, 意味着这是间接寻址模式 (MOVQ (%RCX), %RDX​)
  3. AX​寄存器中的值直接返回 +8(SP)​, 即返回值

思考

image

分析刚刚的源码我们可以知道, LoadInt64做的事情, 实际上就是寻址.

那么我们当然也可以通过go的语法来实现取址 再 寻址

两者是没有什么区别的

这也揭示了一件事情: 在当前的计算机体系下, 并发更多的是由于写引起的, 读在大多数情况下是不存在并发冲突的.

注意

为什么直接取值就可以了?

原因很很简单, 只需要获取当前的最新值就可以了, 在Store和Add时, 都保证了一定会保证原子性.

标签:LoadInt64,源码,atomic,SB,go,AX
From: https://www.cnblogs.com/pDJJq/p/18105576/atomicloadint64-ulvcw

相关文章

  • Go标准库源码分析: atomic.AddInt64
    atomic.AddInt64介绍原理源码看不到源码解释个勾八原理源码里只有函数doc,但是没有函数实现,但是有一段注释//AddInt64atomicallyaddsdeltato*addrandreturnsthenewvalue.//Considerusingthemoreergonomicandlesserror-prone[Int64.Add]instead/......
  • std::atomic 使用
    std::atomic(原子变量)参考文章包括:C++原子变量atomic详解-知乎(zhihu.com)C++中的原子变量(std::atomic)使用指南_std::atomic-CSDN博客cplusplus.com/reference/atomic/atomic/原子变量是C++11中用于多线程编程的便捷工具(同步机制)之一.其提供了一种线程安全的方式来......
  • 原子操作atomic_t
    参考资料:《正点原子Linux驱动开发指南》 volatile关键字可参考:https://www.cnblogs.com/lethe1203/p/18031883原子操作是防止并发访问共享资源的方法之一 linux内核中对原子操作的定义:#include<linux/types.h>typedefstruct{volatileintcounter;}atomic_t;......
  • C++ <atomic>汇编语言实现原理
    C++<atomic>汇编语言实现原理问题我们先看一下这段代码:/**badcnt.c-Animproperlysynchronizedcounterprogram*//*$beginbadcnt*//*WARNING:Thiscodeisbuggy!*/#include"csapp.h"void*thread(void*vargp);/*Threadroutineprototype*//*......
  • Atomic Habits
    from「TheSurprisingPowerofAtomicHabits」良い習慣も、悪い習慣も、時間に従って、倍の効果にできる1.1の365乗は37.780.99の365乗は00.03良い習慣を努力して続く間、linearな成果を見たいが、よくあるのは、見えない。そのため、失望になりやすい事実は、「"cr......
  • [转]Golang atomic.CompareAndSwapInt64()实例讲解
     原文: http://www.manongjc.com/detail/30-anadyrrwgsoebxp.html-------------- 在Go语言中,原子包提供lower-level原子内存,这对实现同步算法很有帮助。Go语言中的CompareAndSwapInt64()函数用于对int64值执行比较和交换操作。此函数在原子包下定义。在这里,您需要导入“syn......
  • Go语言精进之路读书笔记第36条——使用atomic包实现伸缩性更好的并发读取
    atomic包提供了两大类原子操作接口:一类是针对整型变量的,包括有符号整型、无符号整型以及对应的指针类型;另一个类是针对自定义类型的。atomic包十分适合一些对性能十分敏感、并发量较大且读多写少的场合。如果要对一个复杂的临界区数据进行同步,那么首选依旧是sync包中的原语。36.......
  • java Atomic原子类&&常见并发容器
    Atomic原子类Atomic原子类介绍Atomic翻译成中文是原子的意思。在这里Atomic是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。所以,所谓原子类说简单点就是具有原子/原子操作特征的类。并发包 java.util.concurrent 的原......
  • ZooKeeper's atomic broadcast protocol:Theory and practice 翻译
    ZooKeeper’satomicbroadcastprotocol:TheoryandpracticeZooKeeper的原子广播协议:理论和实践Andr´eMedeirosMarch20,2012Abstract摘要ApacheZooKeeperisadistributedcoordinationserviceforcloudcomputing,providingessentialsynchronizationandgrou......
  • 原子操作atomic
    目录简介成员函数简介在C++11中,std::atomic是一个用于原子操作的类模板。它提供了原子的读-改-写操作,以确保在多线程环境下对共享变量的操作是线程安全的。std::atomic的主要用途是对共享变量进行原子操作,例如递增、递减、赋值等。它可以用于实现线程安全的数据结构、计数器......