lock-free stack
Návrh
Zásobník je reprezentován jako linked list
- PUSH (Vložení):
- Vytvoř nový uzel $n$.
- Přečti aktuální vrchol
h = stack.head. - Nastav
n.next = h. - Proveď
CAS(stack.head, h, n).- Pokud uspěje (hlava je stále
h), konec. - Pokud neuspěje (hlava se změnila), opakuj od kroku 2
- Pokud uspěje (hlava je stále
POP (Odebrání):
- Přečti aktuální vrchol
h = stack.head. - Přečti následníka
s = h.next. - Proveď
CAS(stack.head, h, s).- Pokud uspěje, vrať
h. - Pokud neuspěje, opakuj od kroku 1 .
- Pokud uspěje, vrať
Analýza
- Korektnost: CAS zaručuje, že pokud jiný proces modifikuje hlavu zásobníku mezi naším čtením a zápisem, operace se restartuje.
- Vlastnost Lock-free: Systém jako celek postupuje. Pokud CAS selže, znamená to, že jiný proces uspěl. Nemůže nastat deadlock (uvíznutí).
- Livelock: Teoreticky se může stát, že jeden proces neustále selhává, protože ho ostatní předbíhají. V praxi je to nepravděpodobné .