Instrucțiunea CMPXCHG compară valoarea din acumulator (AL/EAX/RAX) cu operandul destinație. Dacă sunt egale, încarcă valoarea sursă în destinație; altfel, încarcă valoarea destinației în acumulator. Cu prefixul LOCK, stă la baza tuturor structurilor de date lock-free.
; Implementarea Compare-and-Swap atomic pe 64 biți:
; bool cas(int64_t *ptr, int64_t valoare_asteptata, int64_t valoare_noua)
; RDI = ptr, RSI = valoare_asteptata, RDX = valoare_noua
global atomic_compare_and_swap
atomic_compare_and_swap:
mov rax, rsi ; Acumulatorul primește valoarea așteptată
lock cmpxchg [rdi], rdx ; Dacă [RDI] == RAX, atunci [RDI] = RDX și ZF = 1
sete al ; AL = 1 dacă schimbul a reușit (ZF == 1), altfel 0
movzx rax, al
ret
Standardul C++20: Este instrucțiunea nativă din spatele metodelor std::atomic::compare_exchange_weak() și compare_exchange_strong().
Întrebări & Exemple de Cod:
CMPXCHG în x86_64: Primitiva Atomică Compare-and-Swap (CAS)Ai o nelămurire despre utilizarea comenzii
CMPXCHG în x86_64: Primitiva Atomică Compare-and-Swap (CAS)sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.