깨어났다는 사실보다 공유 조건을 다시 확인한다

조건 변수는 상태를 저장하지 않는다. mutex가 보호하는 predicate가 진행 가능 여부의 유일한 근거다.

대기자
lock(m)
while (!ready)
  cond_wait(cv, m)

wait는 mutex를 원자적으로 놓고 잠든다. 반환하기 전에 같은 mutex를 다시 획득한다.

통지자
lock(m)
ready = true
signal(cv)
unlock(m)

상태를 먼저 바꾼다. signal은 실행권이나 mutex를 넘기지 않으며 대기자는 이후 경쟁한다.

전체 자원 순서

모두 낮은 번호부터 획득해 순환을 끊는다.

동시 진입 제한

waiter가 최대 N−1명만 시도를 허용한다.

모니터 판정

양쪽 자원이 모두 비었을 때만 한 번에 허가한다.

while이 필요한 이유: 허위 각성뿐 아니라 먼저 깬 다른 스레드가 상태를 소비할 수 있다. wait 반환은 predicate가 참이라는 보장이 아니다.