조건을 상태로 둔다
큐가 비어 있지 않다, 종료 플래그가 켜졌다처럼 검사 가능한 값을 만든다.
condition_variable은 이벤트 자체를 저장하지 않는다. 대기 조건은 공유 상태에 있고, wait는 그 상태를 mutex와 함께 다시 확인해야 한다.
큐가 비어 있지 않다, 종료 플래그가 켜졌다처럼 검사 가능한 값을 만든다.
조건을 바꾸는 코드와 wait에서 조건을 읽는 코드가 같은 잠금을 사용해야 한다.
cv.wait(lock, predicate)는 가짜 깨움과 경쟁을 다시 검사해 준다.
std::unique_lock<std::mutex> lock(m);
cv.wait(lock, [&] { return !queue.empty() || stopped; });
if (stopped && queue.empty()) return;
auto job = std::move(queue.front());