cmpxchg和btr bts之间有所不同

时间:2011-04-04 02:52:18

标签: locking x86

btr,bts指令很简单,它可以锁定共享资源。

为什么指令cmpxchg存在?这两条指令有什么不同?

2 个答案:

答案 0 :(得分:3)

IIRC(已经有一段时间了)lock btrcmpxchg更昂贵,lock INSTR旨在自动锁定总线的原子性并尽可能快地完成。 (具体来说,cmpxchg保持整个指令周期的总线锁定,并完全失效,但CMPXCHG [memaddr], reg的微码仅在绝对需要时锁定并使其无效,以便成为最快的同步原语。)

(编辑:根据this message,它还可以实现更高级的(用户 - )无锁策略。

  

EAX将内存位置与AX(或AL,或   XCHG);如果它们相同,则将源操作数写入内存   地点。显然可以像{{1}}一样使用它,但它   可用于另一种非常有趣的方式,无锁   同步。

     

假设您有一个更新共享数据结构的进程。至   确保原子性,它生成数据的私有更新副本   结构体;当它完成时,它以原子方式更新单个指针   曾经指向旧的数据结构,以便它现在指向   新的数据结构。

     

如果有的话,这种直截了当的方式会很有用   过程失败的可能性,它给你原子性。但我们   可以稍微修改此过程以允许多个   同时更新,同时确保正确性。

     

该过程简单地将指针与其所具有的值进行原子比较   当它开始工作时,如果是这样,使指针指向新的   数据结构。如果某个其他进程已更新数据结构   与此同时,比较将失败,交换不会   发生。在这种情况下,该过程必须重新开始   新近更新的数据结构。

(这实际上是Software Transactional Memory的原始形式。)

答案 1 :(得分:1)

BTRBTS在位级上工作,其中CMPXCHG适用于更宽的数据类型(通常一次为32,64或128位)。它们的功能也不同,英特尔开发人员手册可以很好地总结它们的工作原理。也可能有助于注意某些处理器可能已经很差地实现了BTRBTS(由于它们没有被如此广泛地利用),使CMPXCHG成为高性能锁的更好选择。