内存映射文件的原子操作

Posted

技术标签:

【中文标题】内存映射文件的原子操作【英文标题】:Atomic operations on memory mapped files 【发布时间】:2015-04-24 22:48:16 【问题描述】:

我正在使用内存映射文件,我需要在 Go 上使用原子存储。如果我正在处理定期分配的内存,我会使用 StoreUint64()。但是,我不确定原子操作如何对内存映射文件起作用。

在内存映射文件上使用 StoreUint64() 是否安全?

【问题讨论】:

【参考方案1】:

很安全。例如,在amd64 上,它使用XCHG 指令。

func StoreUint64

    func StoreUint64(addr *uint64, val uint64)

StoreUint64 以原子方式将val 存储到*addr

src/sync/atomic/asm_amd64.s;

TEXT ·StoreUint64(SB),NOSPLIT,$0-16
    MOVQ    addr+0(FP), BP
    MOVQ    val+8(FP), AX
    XCHGQ   AX, 0(BP)
    RET

英特尔 64 和 IA-32 架构软件开发人员手册

XCHG—用寄存器交换寄存器/内存

说明

交换目标的内容(第一个)和 源(第二个)操作数。操作数可以是两个通用的 寄存器或寄存器和内存位置。如果内存操作数是 引用,处理器的锁定协议是自动 在交易所操作期间实施,无论 LOCK 前缀或值的存在与否 IOPL。

【讨论】:

以上是关于内存映射文件的原子操作的主要内容,如果未能解决你的问题,请参考以下文章

CUDA 内核中映射固定主机内存上的原子操作:做还是不做?

如何对并发映射的值进行原子操作?

原子操作的实现原理

Java内存模型原子性内存可见性重排序顺序一致性volatile锁final

CUDA: 原子操作

忙等待循环中是不是需要内存屏障或原子操作?