比较并交换技术能否防止同时访问同一内存位置?

3
CAS操作是否保证在其执行期间没有其他线程会同时访问相同的内存位置?粗体文本指的是什么?

https://en.wikipedia.org/wiki/Compare-and-swap

在计算机科学中,比较交换(CAS)是一种用于多线程同步的原子指令。它将内存位置的内容与给定值进行比较,只有当它们相同时,才将该内存位置的内容修改为新的给定值。这是作为单个原子操作完成的。原子性保证了新值是基于最新信息计算的;如果值在此期间被另一个线程更新,写入将失败。操作的结果必须指示是否执行了替换;这可以通过简单的布尔响应(此变体通常称为比较并设置)或通过返回从内存位置读取的值(而不是写入的值)来完成。
1个回答

1

是的,你可以这样考虑。如果CAS成功,那么你可以保证在“比较”和“交换”之间没有其他线程对该内存位置进行写入。

有些体系结构仅在操作期间锁定该内存位置(或缓存行),以使其他写入变得不可能。在这种体系结构上,CAS将始终成功。在其他体系结构(所谓的 LL/SC)中,执行CAS的核心可能会简单地监视内存位置,如果发生错误时间的另一个写入,则CAS将不会进行写入并指示失败。


3
值得一提的是,任何认为自己可以通过使用CAS受益的人都应该意识到ABA问题。 - Solomon Slow
感谢 @Solomon Slow,好的,我会看一下,谢谢 +1 - user19481364
2
@Daniel:当然你可以添加锁,但如果这样做的话,你一开始就不需要原子CAS了。(实际上,你的互斥锁可能是在库或操作系统中使用CAS或类似的原子操作实现的。)你可以通过语言文档来了解你的语言是否支持CAS;通常,在单核系统中,原子性不是问题的情况下,你的语言CAS函数可能会以更简单、更便宜的方式实现,而不需要这些特殊的指令。(尽管即使在单核系统中,中断方面仍需要原子性。) - Nate Eldredge
1
@Nate Eldredge 的回答非常好:“即使是单核系统,也需要在中断方面具备原子性。” 这是因为 CAS 应该是一个不可中断的操作,并且单核 CPU 执行虚拟化并行化(上下文切换),对吧? +1 - user19481364
2
@Daniel:是的,完全正确。 - Nate Eldredge
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接