为什么它被称为读-修改-写而不是读-写?

Lin*_*gxi 4 terminology atomic

在我看来,术语read-modify-write没有多大意义,因为modify只是write 的另一种说法。引自维基百科(强调我的):

在计算机科学中,读​​-修改-写是一类原子操作[...],它可以同时读取内存位置和向其中写入新值[...]

那么为什么不简单地读写呢?两者之间有什么微妙的语义区别吗?

LWi*_*sey 10

为什么它被称为读-修改-写而不是读-写?

因为这正是典型架构上的事件序列,例如X86.

  1. read:值从内存位置(缓存)读取到 CPU 寄存器中
  2. 修改:该值在 CPU 寄存器内递增
  3. write:更新的寄存器值被写回内存(缓存)。

为了创建原子性的感知,缓存行在readwrite操作之间被锁定。

例如,增加一个 C++ 原子变量:

g.fetch_add(1);
Run Code Online (Sandbox Code Playgroud)

被编译gcc成:

0x00000000004006c0 <+0>:     lock addl $0x1,0x200978(%rip)        # 0x601040 <g>
Run Code Online (Sandbox Code Playgroud)

尽管是一条指令,addl但它本身并不是原子的。该lock前缀必须保证更新的寄存器值写回高速缓存行,才可以通过其他核心被访问(存储缓冲区被刷新,但绕过RMW操作)。

MESI高速缓存一致性协议可以确保所有内核观察对高速缓存线锁定后的更新的存储器值已被释放。这保证了所有线程都遵守 C++ 标准对 RMW 操作所需的修改顺序中的最新值。