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

标签 c multithreading concurrency atomic compare-and-swap

显然,可以使用比较和交换指令自动递增两个整数。 This talk声称存在这样的算法,但没有详细说明它的样子。

enter image description here

如何做到这一点?

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

最佳答案

让我想到顺序锁。不是很准确(根据内存),但大致如下:

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

递增:

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

memory barrier
atomic x++
atomic y++
atomic s++
memory barrier

阅读:

do {
    S1 = load s
    X = load x
    Y = load y
    memory barrier
    S2 = load s
} while (S1 != S2)

另见 https://en.wikipedia.org/wiki/Seqlock

关于c - 使用 CAS 以原子方式递增两个整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33083270/

相关文章:

iOS GCD Max 并发操作

python - 如何使用2个线程访问1个网络摄像头

C++ 线程安全 : If only one thread can write to a non-atomic variable but multiple threads read from it.。可以遇到问题吗?

c - C 中的动态 char** 数组

c - 为什么下面的 C 语言代码会给出这样的输出?

c - "assignment discards ' const 非常量指针上的 ' qualifier"错误

c - 如何在内存中创建游戏娃娃/炸弹?

c# - MSDN 上 SimplePriorityQueue 示例中的严重错误

c - 无法异步打印偶数和奇数

java - 编译时检查或 java.util.ConcurrentModificationException