spurious wakeup
깨어났다는 사실보다 조건 재검사가 중요하다
조건 변수는 알림 없이도 깨어날 수 있습니다. 그래서 대기 코드는 항상
wait(lock, predicate) 형태로 반복 검사를 품어야 합니다.
1
predicate 확인
조건이 이미 참이면 기다리지 않고 바로 진행합니다.
2
거짓이면 대기
wait가 mutex를 풀고 스레드를 잠들게 합니다.
3
깨어남
notify일 수도, 가짜 깨어나기일 수도 있습니다.
4
다시 검사
조건이 참일 때만 임계 영역 작업으로 들어갑니다.
if로 한 번만 확인하지 말고, predicate가 참이 될 때까지 반복 확인하는 구조를 사용합니다.