Ваша проблема может быть связана с этим циклом чтения:
for(int i = 0; i < buffer.size(); i++)
{
printf("%d\n", buffer.front());
buffer.pop_front();
}
Проблема в том, что выше будет читать только половину элементов. Поскольку по мере того, как вы выталкиваете элементы, buffer.size () уменьшается, поэтому итерации заканчиваются, когда размер в два раза меньше того, который был при его запуске. Вы должны просто заменить его циклом while:
while(buffer.size() > 0)
{
printf("%d\n", buffer.front());
buffer.pop_front();
}
По сути, происходило то, что какое-то время это становилось удачным и вроде работало (частично из-за ложных срабатываний условных переменных), но в конце концов поток чтения просто никогда не очищал буфер и поток записи никогда не просыпается По крайней мере, я думаю, что это проблема ... проблемы многопоточности никогда не бывает тривиальными на первый взгляд.