CAS指令如何保证原子性 [英] How does CAS instructions guarantee atomicity

查看:18
本文介绍了CAS指令如何保证原子性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

根据Wiki,CAS这样做:

function cas(p : pointer to int, old : int, new : int) returns bool {
    if *p ≠ old {
        return false
    }
    *p ← new
    return true
}

嗯,在我看来,如果几个处理器将尝试执行带有相同参数的CAS指令,则可能会同时进行几次写入尝试,因此无论如何这样做都不安全。

我哪里错了?

推荐答案

同时来自多个内核的原子读-比较-写指令执行相互竞争,但这取决于硬件。Hardware arbitration of atomic RMW instructions在现代CPU中是实实在在的东西,它提供了一定程度的公平性,因此在lock cmpxchg上旋转的一个线程不能完全阻止其他线程做同样的事情。(尽管这是一个糟糕的设计:最好是在收购-加载时旋转,只有在应该成功的情况下才做CAS)

不能保证它们以什么顺序发生,这就是为什么您需要仔细设计算法,以便正确性仅取决于比较和交换是原子的。(ABA problem是常见的陷阱)。


btw,整个伪代码块作为单个原子操作发生。对于硬件来说,使读-比较-写或读-修改-写作为单个原子操作发生要比仅仅存储要难得多,而MESIF/MOESI可以很好地处理存储。

您确定吗?我认为这样做是不安全的,因为例如,x86不能保证非对齐的DWORD的写入原子性

lock cmpxchg使操作原子化,而不管对齐情况。对于未对齐的情况,它可能会慢得多,特别是在高速缓存线拆分中,原子地修改单个高速缓存线是不够的。

另请参阅Atomicity on x86,我将在此解释原子操作的含义。

这篇关于CAS指令如何保证原子性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆