2010-03-19 5 views

답변

1

다를 수 있습니다 XNU 소스의 OSAtomic.s 파일에있는 원자 함수 중 하나. 예를 들어, 다음 버전 1486년 2월 11일에서 OSAtomicCompareAndSwapPtr for x86_64입니다 :

_OSCompareAndSwap64: 
_OSCompareAndSwapPtr: #;oldValue, newValue, ptr 
    movq   %rdi, %rax 
    lock 
    cmpxchgq %rsi, 0(%rdx) #; CAS (eax is an implicit operand) 
    sete  %al    #; did CAS succeed? (TZ=1) 
    movzbq  %al, %rax  #; clear out the high bytes 
    ret 
+0

+1 감사합니다. 그래서 결국 OSCompareAndSwap은 CMPXCHG8B와 같은 ABA 문제에 면역이됩니까? – Viet

+0

저는 CMPXCHG8B에 익숙하지 않지만, cmpxchg와 동일한 의미를 갖고 있으며 보이는 부분 만 다릅니다. 32 비트에서 레지스터는 32 비트 폭이므로 CMPXCHG8B는 64 비트 CAS를 수행 할 수 있도록 레지스터 쌍을 조사합니다. i386 비트 OSAtomic.s 파일에서 64 비트 CAS 작업에 사용됨을 알 수 있습니다. – Ken

+0

아니요를 의미합니다. 감사. – Viet

0

잠금 CMPXCHG8B

더 정확히

그것은 인텔 프로세서, 그러나 고려, 그 OSX뿐만 아니라 인텔 아키텍처 용으로 존재하는, 그래서 ASM 당신은 정의를 찾을 수 있습니다

+0

덕분에, 나는 "CMPXCHG8B을 잠금"및 OS X이 너무 PPC에서 실행되는 것을 알고 알고 있습니다. 하지만 인텔 32 비트 OSX를 사용하는 경우에는 그럴 수 있습니까? – Viet

+0

함수 매개 변수에서 적절한 레지스터로 이동하기 전에 추가됩니다. – drlazy