Разрабатывать @ решение Ивана ...
Вместо условной переменной mutex + вы можете использовать счетный семафор + атомарные операции для создания очень эффективной очереди.
semaphore dequeue_sem = 0;
semaphore enqueue_sem = 37; // or however large you want to bound your queue
Операция постановки в очередь просто:
wait_for(enqueue_sem)
atomic_add_to_queue(element)
signal(dequeue_sem)
Операция удаления из очереди:
wait_for(dequeue_sem)
element = atomic_remove_from_queue()
signal(enqueue_sem)
"atomic_add_to_queue" и "atomic_remove_from_queue" обычно реализуются с использованием атомарного сравнения и обмена в тесном цикле.
Помимо своей симметрии, эта формулировка ограничивает максимальный размер очереди; если поток вызывает enqueue () для полной очереди, он блокируется. Это почти наверняка то, что вы хотите для любой очереди в многопоточной среде. (Ваш компьютер имеет ограниченную память; по возможности следует избегать его использования без ограничений.)
Если вы используете мьютекс и условные переменные, вам нужно два условия: одно для очереди, чтобы ждать (и deque для подачи сигнала), и другое для обратного. Условия означают «очередь не заполнена» и «очередь не пуста», соответственно, и код очереди / очереди аналогично симметричен.