2010-03-19 25 views

Répondre

2

Tout dépend de l'implémentation. OSCompareAndSwap * est seulement une interface qui garantit un opérateur CAS atomique (si la CPU le supporte).

Pour x86 cette fonction 64 bits est mis en œuvre comme

_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 

donc la réponse pour vous est probablement « oui ».

+0

+1 merci Kenny. Donc _OSCompareAndSwap64 contient cmpxchg8b, je suppose qu'il devrait être immunisé au problème ABA alors. – Viet