condition variable contract

조건 변수는 “상태를 바꾸고, 알리고, 다시 검사한다”는 계약이다

조건 변수는 값을 저장하지 않습니다. 실제 조건은 공유 상태에 있고, 대기자와 알림자가 같은 mutex 아래에서 그 상태를 다룹니다.

1 shared state

큐 비어 있음, 완료 플래그처럼 기다릴 조건의 실제 값입니다.

2 same mutex

대기자와 생산자가 같은 상태를 같은 락으로 읽고 씁니다.

3 wait(predicate)

잠들기 전과 깨어난 뒤 조건식을 모두 검사합니다.

4 state change + notify

상태를 참으로 바꾼 뒤 대기자에게 다시 확인하라고 알립니다.

5 recheck

깨어났다는 사실이 아니라 predicate가 참일 때만 진행합니다.

상태
조건의 진짜 값은 변수에 둔다.
상태를 읽고 쓰는 모든 쪽이 같은 mutex를 쓴다.
조건식
spurious wakeup 때문에 깨어난 뒤에도 다시 검사한다.
알림
notify는 “진행해도 된다”가 아니라 “다시 확인하라”는 신호다.