대기자
lock(m)
while (!ready)
cond_wait(cv, m)wait는 mutex를 원자적으로 놓고 잠든다. 반환하기 전에 같은 mutex를 다시 획득한다.
조건 변수는 상태를 저장하지 않는다. 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가 참이라는 보장이 아니다.