공유 상태 정의
대기 조건이 되는 queue, flag, count를 하나의 mutex로 보호한다.
조건 변수 자체가 상태를 저장하지 않는다condition_variable은 스레드를 깨우는 도구라는 설명만으로는 부족하다. 공유 상태를 mutex로 보호하고, wait는 predicate를 반복 확인하며, notify는 상태 변경 뒤 호출해야 spurious wakeup과 lost wakeup을 피할 수 있다.
대기 조건이 되는 queue, flag, count를 하나의 mutex로 보호한다.
조건 변수 자체가 상태를 저장하지 않는다consumer는 unique_lock으로 mutex를 잡고 predicate를 확인한다.
condition_variable wait에는 unique_lock이 필요하다wait(lock, predicate)를 사용해 깨어난 뒤 조건을 다시 확인한다.
spurious wakeup을 전제로 코드를 짠다producer는 락 안에서 queue에 넣거나 flag를 바꾸고 notify_one 또는 notify_all을 호출한다.
상태 없는 notify는 잃어버릴 수 있다작업 종료 flag와 wait_for timeout을 설계해 영원히 기다리는 스레드를 막는다.
종료 조건도 predicate에 포함한다