wait flow

wait는 잠들 때 락을 풀고, 깨어나면 다시 잠근 뒤 조건을 본다

cv.wait(lock, pred)를 코드 한 줄로 보지 말고, 락 해제와 재획득이 들어 있는 흐름으로 읽어야 합니다.

1. unique_lock 획득 공유 상태를 안전하게 읽기 위해 mutex를 잠급니다.
2. predicate 검사 조건이 참이면 기다리지 않고 진행합니다.
3. wait 대기 조건이 거짓이면 락을 풀고 스레드를 잠들게 합니다.
4. notify 후 재획득 깨어날 때 mutex를 다시 잠근 뒤 반환합니다.
5. 조건 참이면 작업 큐 pop 같은 임계 영역 작업을 수행합니다.
알림자는 공유 상태를 먼저 바꾸고 notify합니다. 대기자는 깨어난 뒤 상태를 다시 확인합니다.