CAS指令如何保证原子性 [英] How does CAS instructions guarantee atomicity
本文介绍了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)
btw,整个伪代码块作为单个原子操作发生。对于硬件来说,使读-比较-写或读-修改-写作为单个原子操作发生要比仅仅存储要难得多,而MESIF/MOESI可以很好地处理存储。
您确定吗?我认为这样做是不安全的,因为例如,x86不能保证非对齐的DWORD的写入原子性
lock cmpxchg
使操作原子化,而不管对齐情况。对于未对齐的情况,它可能会慢得多,特别是在高速缓存线拆分中,原子地修改单个高速缓存线是不够的。
另请参阅Atomicity on x86,我将在此解释原子操作的含义。
这篇关于CAS指令如何保证原子性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文