조건을 변수로 둔다
queue가 비어 있지 않다, stopped가 true다 같은 검사가 가능한 상태가 필요하다.
notify는 이벤트를 저장하지 않는다. wait는 깨어난 뒤에도 predicate를 다시 확인해야 하며, 그 predicate는 mutex로 보호된 상태여야 한다.
queue가 비어 있지 않다, stopped가 true다 같은 검사가 가능한 상태가 필요하다.
조건을 바꾸는 코드와 조건을 기다리는 코드가 같은 mutex를 사용해야 race가 줄어든다.
가짜 깨움이나 먼저 온 알림 때문에 깨어나도 조건이 참인지 다시 확인한다.
std::unique_lock lock(m);
cv.wait(lock, [&] { return stopped || !jobs.empty(); });
if (stopped && jobs.empty()) return;