한 스레드가 락을 잡고 컨텍스트 스위치되면 → 나머지 전부 블로킹. 최악의 경우 전체 시스템이 멈춤.
다른 스레드가 모두 멈추면 → 나는 진행 가능. 실전에서는 거의 쓰이지 않음.
전체 시스템에서 최소 1개 스레드는 항상 진행. 단, 특정 스레드가 CAS 경합에서 계속 지면 그 스레드는 무한정 밀릴 수 있음 (starvation). A가 컨텍스트 스위치되어도 B, C는 멈추지 않고 자기 CAS를 진행. 문제는 A가 깨어나서 CAS할 때마다 다른 스레드한테 밀리면 A만 계속 굶는 것. 현실에선 드물지만 보장이 없음.
모든 스레드가 유한 스텝(O(N)) 내에 반드시 완료. 어떤 스레드도 굶지 않음. 가장 강한 진행 보장.
CAS 루프 기반 Lock-Free Push 예시:
while (true) {
auto oldTop = _top;
node->next = oldTop;
if (CAS(&_top, oldTop, node)) // 성공하면 탈출
break;
// 실패하면 재시도 — 운 나쁘면 계속 실패 가능
}
스레드 A가 CAS를 시도할 때마다 스레드 B, C가 먼저 성공하면, A는 이론적으로 무한 재시도할 수 있다. 실시간 보장이 필요한 시스템에서는 문제.
Lock-Free는 CAS 한 번에 바로 시도하지만, Wait-Free는 "나 이거 할 거야"를 먼저 공유 배열(announce)에 게시하는 방식.
[Lock-Free Push]
1. 노드 준비
2. CAS로 연결 시도
3. 실패하면 재시도 (무한 반복 가능)
[Wait-Free Push]
1. 노드 준비
2. 공유 배열(announce)에 "나 이 노드 넣을 거야" 게시
3. CAS로 연결 시도
4. 실패해도 괜찮음 — 다른 스레드가 내 게시물을 보고 대신 넣어줌