cond_var.wait(lock);
не ждет блокировки.Эта строка делает 3 вещи
- Она разблокирует переменную
lock
- Она ждет, пока кто-то не сообщит о состоянии.
- она снова блокирует переменную
lock
, прежде чемон возвращается,
Он делает все это атомарно.Пока поток ожидает переменную условия, мьютекс не блокируется - таким образом, поток вашего производителя может получить блокировку и безопасно установить любые переменные, общие для потребителей / производителей.
Он снова блокирует мьютекс по возвращении, поэтому потребитель снова может безопасно получить доступ к общим переменным.
Если бы вы попытались самостоятельно управлять блокировкой / разблокировкой мьютекса, вы в конечном итоге получили бы условия гонки между блокировкой / разблокировкой мьютекса и ожиданием / сигнализацией переменной условия - вот почему ожидание переменной условия связано смьютекс - так это может быть сделано атомарно, без условий гонки.