Macos OSCompareAndSwap是否对CMPXCHG8B等ABA问题免疫?

Macos OSCompareAndSwap是否对CMPXCHG8B等ABA问题免疫?,macos,assembly,kernel,atomic,compare-and-swap,Macos,Assembly,Kernel,Atomic,Compare And Swap,OSCompareAndSwap对CMPXCHG8B这样的ABA问题免疫吗?这一切都取决于实现。OSCompareAndSwap*只是一个保证原子CAS运算符的接口(如果CPU支持) 对于此函数,64位的实现如下 _OSCompareAndSwap64: pushl %edi pushl %ebx movl 4+8(%esp), %eax #; low 32-bits of oldValue movl

OSCompareAndSwap对CMPXCHG8B这样的ABA问题免疫吗?

这一切都取决于实现。OSCompareAndSwap*只是一个保证原子CAS运算符的接口(如果CPU支持)

对于此函数,64位的实现如下

_OSCompareAndSwap64:
    pushl       %edi
    pushl       %ebx

    movl         4+8(%esp), %eax    #; low 32-bits of oldValue
    movl         8+8(%esp), %edx    #; high 32-bits of oldValue
    movl        12+8(%esp), %ebx    #; low 32-bits of newValue
    movl        16+8(%esp), %ecx    #; high 32-bits of newValue
    movl        20+8(%esp), %edi    #; ptr
    lock
    cmpxchg8b   0(%edi)     #; CAS (eax:edx, ebx:ecx implicit)
    sete        %al         #; did CAS succeed? (TZ=1)
    movzbl      %al, %eax       #; clear out the high bytes

    popl        %ebx
    popl        %edi
    ret

所以你的答案可能是“是的”。

+1谢谢肯尼。因此_OSCompareAndSwap64包含cmpxchg8b,我想它应该不会受到ABA问题的影响。@Vieta:CAS易受ABA问题的影响,这与LL/SC不同。如果目标64位值更改为B,现在又返回到A,
cmpxchg8b
将成功,即使在您最初阅读A之后发生了问题。如果您的64位值是32位指针和32位计数器,那么ABA就不会发生。这就是为什么您首先要使用DWCAS(双字CAS)。这并不是因为DWCA本身不受ABA的影响,而是因为它为您提供了向您正在使用的CAS中添加非真实数据的空间。