Как добиться безблокирующего, но блокирующего поведения?

Я реализую свободную от блокировок очередь с одним производителем и одним потребителем для интенсивного сетевого приложения. У меня есть несколько рабочих потоков, получающих работу в своих собственных отдельных очередях, которые они затем удаляют из очереди и обрабатывают.

Снятие блокировок из этих очередей значительно улучшило производительность при высокой нагрузке, , но они больше не блокируются, когда очереди пусты , что, в свою очередь, приводит к резкому увеличению использования ЦП.

Как я могу эффективно заставить поток блокироваться до тех пор, пока он не сможет успешно удалить что-либо из очереди или не будет убит / прерван?

15
задан haste 22 May 2011 в 18:34
поделиться