首页 > 其他分享 >atomic.SwapInt64

atomic.SwapInt64

时间:2024-03-30 15:46:18浏览次数:28  
标签:SwapInt64 交换 指令 atomic 寄存器 XCHG AX

atomic.SwapInt64

汇编

不再浪费时间去找源码了, 因为atomic这部分的实现全部都依赖于底层的汇编指令

image

会发现一件事情, 那就是这里的实现和Store是几乎一致的, 为什么呢?

原因出在XCHG

XCHG

XCHG​ 是x86架构汇编语言中的一条指令,它的全称是“Exchange Register/Memory with Register”,即“用寄存器交换寄存器/内存中的内容”。这条指令用于交换两个操作数的值。这两个操作数可以是寄存器或其中一个是内存地址。

举例来说,在x86汇编中:

XCHG AX, BX

这条指令将交换 AX​ 和 BX​ 两个寄存器中的值。

或者与内存地址交换:

XCHG AX, [MEM_ADDR]

这将交换 AX​ 寄存器和内存地址 MEM_ADDR​ 指向的值。

XCHG​ 指令在多线程编程和同步机制中尤其有用,因为该指令在单个操作中执行读取、写入以及交换操作,能够原子性地进行,避免了多线程中的竞态条件。在现代CPU中,使用XCHG指令通常会隐含地锁定总线,以防止其他处理器或缓存同时访问相同的内存地址,确保操作的原子性。但是这会带来性能的开销,因此在多核处理器上要谨慎使用。

在现代编程中,通常不需要直接使用XCHG指令。编程语言和它们的库通常会提供更高层次的抽象来处理多线程同步的问题,例如互斥锁(Mutexes)和条件变量(Condition Variables)。然而,操作系统和某些底层系统库可能会在它们的实现中使用这类指令。

请详细阅读这部分内容: 这条指令将交换 ***AX*** ***BX***两个寄存器中的值。**

此时我们再回头看交换完之后, CX​的值是原本(AX)​的内容, 而(AX)​被写入了我们的预期值, 那么后续将CX写回SP就完成了.

标签:SwapInt64,交换,指令,atomic,寄存器,XCHG,AX
From: https://www.cnblogs.com/pDJJq/p/18105581/atomicswapint64-1skpna

相关文章

  • atomic.StoreInt64
    atomic.StoreInt64源码依然将细节隐藏了起来,沟槽的TEXT sync∕atomic·StoreInt64(SB),NOSPLIT|NOFRAME,$0-16 GO_ARGS MOVQ $__tsan_go_atomic64_store(SB),AX CALL racecallatomic<>(SB) RET汇编​​解释把2​移入CX调用XCHGQ​,来原子性的修改CX和......
  • atomic.LoadInt64
    atomic.LoadInt64源码在经历了之前查看AddInt64​的经历后,我们可以确定LoadInt64​的代码位置TEXTruntime∕internal∕atomic·Loadint64(SB),NOSPLIT,$0-16 JMP runtime∕internal∕atomic·Load64(SB)我们看到,其实是直接调用runtime∕internal∕atomic·Load64​这......
  • 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 的原......