想象一下场景: 2核心在同一时间完成CaS的操作。处理器需要读取旧值,然后放置一个新值,在旧值中是相同的。如果他们同时阅读 怎么办?或者那里的变量是否有任何锁定,阻止其他内核读取?
答案 0 :(得分:2)
是的,在大多数架构中,每个核心都会尝试一个“所有权读取”流程,这意味着它只是为了更改它而要求该行。其中一个将获胜,将数据发送回请求核心并使另一个请求阻止或以某种方式回收。确切的细节取决于设计,但总的来说,您可以期望获胜的核心消耗数据并以原子方式将其更改为新值(通过内部锁定,因此它不会受到干扰),然后使用内部写回或缓存的新数据完成操作(处于修改状态)。
此时,另一个请求可能会继续并尝试获取该行的所有权 - 如果该行仍保留在第一个核心中,则会导致监听器读取已修改的数据。然后第二个核心可以重复与第一个核心相同的过程。
在更简单的系统上,通过在此过程中停止所有内存事务("总线锁定",如Egor所提到的),可以实现相同的目标,但这些日子的性能非常罕见可怕的是,它保留了非常复杂的情况,例如变量未对齐且数据在两行之间分裂。
请注意,理想情况下,关键部分(CaS)应在内核内部完成,本地缓存行锁可以保持原子性(当他锁定时,没有其他人可以读取或获取该行的所有权它),而其他核心可以访问其他内存地址而不会失去一致性或原子性。