조건 변수는 신호보다 조건 재검사가 핵심이다
wait는 mutex를 내려놓고 잠들며, 깨어난 뒤에는 조건이 여전히 참인지 while로 다시 확인해야 한다.
lock
mutex 획득
조건과 상태 보호
check
while predicate
조건이 거짓이면 대기
wait
unlock + sleep
깨어나면 재획득
signal
state changed
대기자에게 재검사 기회
규칙
이유
깨지는 경우
while 사용
spurious wake 대응
if만 쓰면 잘못 통과
상태 먼저 변경
신호 의미 보존
lost wakeup
mutex와 함께
조건 일관성
경쟁으로 값 변경
signal/broadcast
깨울 범위 선택
불필요한 깨움 과다