Когда я пытаюсь нажать первый элемент (push_front). Функция «push_front ()» достигает условной переменной и переходит в ожидание получения уведомления [...]
Это неверно. Внимательно прочитайте документацию этого API. То, что вы описываете, это поведение
template<typename L> void wait(L & lock);
, которое является номером 3 в списке открытых функций-членов. Тем не менее, вызов wait
в вашем коде имеет два аргумента;Ваш код звонит
template<typename L, typename Pr> void wait(L & lock, Pr pred);
, который является номером 4 в этом списке. Эта функция задокументирована как то же самое, что и
while ( !pred() )
wait(lock); // <-- This is where the thread waits for a notification
То есть сначала проверяется предикат, и только если он имеет значение false, поток будет ожидать получения уведомления. Пока пустой буфер не заполнен, предикат будет изначально истинным, поэтому выполнение продолжается без ожидания уведомления. (Однако, если вы должны были создать буфер с нулевой емкостью, то это выглядит так, как будто он зависнет при попытке вставить первый элемент в буфер.)