공유 상태
큐가 비었는지, 작업이 끝났는지처럼 predicate가 되는 상태를 mutex로 보호한다.
조건은 데이터condition_variable의 핵심은 notify가 아니라 기다리는 조건이다. spurious wakeup이 가능하므로 wait는 반드시 predicate loop와 함께 쓰고, 상태 변경과 알림 순서를 분리해 읽는다.
큐가 비었는지, 작업이 끝났는지처럼 predicate가 되는 상태를 mutex로 보호한다.
조건은 데이터unique_lock을 잡고 predicate 버전 wait를 사용해 깨어난 뒤 조건을 다시 검사한다.
while과 동일생산자는 락 안에서 데이터를 넣거나 flag를 바꿔 predicate를 참으로 만든다.
순서 보장조건 변경 후 notify_one 또는 notify_all로 대기자를 깨운다.
알림은 힌트std::unique_lock<std::mutex> lock(m);
cv.wait(lock, [&] { return !queue.empty() || done; });