condition은 사실을 저장하지 않는다—predicate가 진실이고 signal은 재검사 알림이다

공유 상태·그 상태를 보호하는 mutex·상태 변화를 기다리는 condition을 같은 경계로 묶어야 lost wakeup과 잘못된 진행을 막을 수 있다.

Mutex · 누가 만지나

predicate를 읽고 공유 상태를 바꾸는 모든 경로를 같은 lock 규칙으로 직렬화한다.

Predicate · 진행 가능한가

count > 0처럼 공유 변수로 표현한 조건만이 실행 가능 여부를 결정한다.

Condition · 다시 보라

상태가 바뀌었을 가능성을 waiter에게 알린다. 깨어남 자체는 predicate 참을 보장하지 않는다.

1. Lock연결된 mutex를 획득한다.
2. While checkpredicate가 false인 동안만 기다린다.
3. Waitmutex release와 sleep을 원자적으로 연결한다.
4. Change + notify다른 thread가 lock 안에서 상태를 바꾸고 signal/broadcast한다.
5. Reacquirewait가 돌아오기 전에 같은 mutex를 다시 소유한다.
6. Recheckspurious wakeup·경쟁을 고려해 while 처음으로 돌아간다.
predicate false ↺ Wait · predicate true → 임계 작업 진행

if 한 번깨어난 사이 다른 thread가 상태를 소비할 수 있다.

mutex 불일치predicate 검사·변경·wait가 다른 보호 경계를 쓰면 race가 남는다.

상태 없는 signalpredicate를 바꾸지 않은 알림은 진행 조건을 만들지 못한다.

signal / broadcast한 waiter면 signal, 여러 종류의 조건이 다시 판단해야 하면 broadcast 비용을 검토한다.