spurious wakeup

깨어났다는 사실보다 조건 재검사가 중요하다

조건 변수는 알림 없이도 깨어날 수 있습니다. 그래서 대기 코드는 항상 wait(lock, predicate) 형태로 반복 검사를 품어야 합니다.

1 predicate 확인 조건이 이미 참이면 기다리지 않고 바로 진행합니다.
2 거짓이면 대기 wait가 mutex를 풀고 스레드를 잠들게 합니다.
3 깨어남 notify일 수도, 가짜 깨어나기일 수도 있습니다.
4 다시 검사 조건이 참일 때만 임계 영역 작업으로 들어갑니다.
if로 한 번만 확인하지 말고, predicate가 참이 될 때까지 반복 확인하는 구조를 사용합니다.