std::mutex m;
std::condition_variable cv;

void consumer()
{
	std::unique_lock<std::mutex> ul(m);
	// notify가 올때까지 대기.
	cv.wait(ul);
}

void producer()
{
	// ... 로직 처리.

	// wait중인 스레드를 깨어나게 한다.
	cv.notify_one();

	// wait중인 모든 스레드를 깨어나게 한다.
	cv.notify_all();
}

위의 예에서 생산자가 먼저 호출되었을때

// 두번째 인자인 predicate를 이용한다.
cv.wait(ul, [] { return data_ready; } );