C++ · 조건 변수

condition_variable 대기 계약

condition_variable은 알림 큐가 아니라 공유 상태가 바뀌었음을 깨우는 장치입니다. wait는 mutex와 predicate를 함께 써야 안전합니다.

predicate wait 패턴

wait
unique_lockwait가 내부에서 unlock/relock을 해야 하므로 lock_guard가 아니라 std::unique_lock을 넘깁니다.
조건자 점검cv.wait(lock, [] { return ready; }) 형태로 조건을 코드에 둡니다.
wait조건이 거짓이면 mutex를 원자적으로 풀고 잠들며, 깨어날 때 다시 잠급니다.
notify_one/all생산자는 같은 mutex 아래 공유 상태를 바꾼 뒤 notify_one/all로 깨웁니다.
recheck깨어난 이유가 알림이 아닐 수도 있어 predicate가 참일 때만 진행합니다.
lockpred 확인waitnotify재확인

허위 깨움

sync
spurious wakeupnotify 없이도 깨어날 수 있어 while 루프나 predicate overload가 필요합니다.
notify 타이밍상태 변경이 먼저입니다. notify는 락 안팎 모두 가능하지만 불필요한 재대기를 줄입니다.
lock scope공유 큐 pop처럼 상태 확인과 소비는 같은 임계구역에서 처리합니다.
lost wakeup조건 변수 자체는 상태를 저장하지 않으므로 predicate 없이 wait하면 알림을 놓칠 수 있습니다.