使用CAS以原子方式递增两个整数

boo*_*ife 17 c concurrency multithreading atomic compare-and-swap

显然,可以使用比较和交换指令以原子方式递增两个整数.这个谈话声称存在这样的算法,但它没有详细说明它的样子.

在此输入图像描述

如何才能做到这一点?

(注意,一个接一个地递增整数的明显解决方案不是原子的.另外,将多个整数填充到一个机器字中并不算数,因为它会限制可能的范围.)

gby*_*gby 4

让我想到顺序锁。不是很准确(从记忆中得出),但大致如下:

令 x、y 和 s 为 64 位整数。

递增:

atomic s++(我的意思是使用 64 位 CAS 操作的原子增量)

memory barrier
atomic x++
atomic y++
atomic s++
memory barrier
Run Code Online (Sandbox Code Playgroud)

读书:

do {
    S1 = load s
    X = load x
    Y = load y
    memory barrier
    S2 = load s
} while (S1 != S2)
Run Code Online (Sandbox Code Playgroud)

另请参阅https://en.wikipedia.org/wiki/Seqlock