Параметры:
1) Если ваша очередь никогда не станет большой, используйте кучу и заблокируйте всю структуру для каждой вставки и удаления.
2) Если ваша очередь станет большой, вы можете использовать алгоритм, подобный следующему:
http://www.research.ibm.com/people/m/michael/ipl-1996.pdf
Этот алгоритм позволяет нескольким потокам работать со структурой кучи одновременно без риска повреждения или взаимоблокировки, поддерживая мелкозернистую блокировку только частей дерева одновременно. Вам нужно будет провести тестирование, чтобы увидеть, стоят ли накладные расходы на дополнительные операции блокировки и разблокировки дороже, чем конкуренция за блокировку всей кучи.
3) Если вы стремитесь полностью избежать блокировок, другой алгоритм, упомянутый в ссылке выше, предлагает использовать очередь запросов FIFO (легко реализуемую без блокировок) и отдельный поток, который является единственной вещью, которая касается кучи , Вам нужно измерить, чтобы увидеть, как издержки переключения фокуса между потоками с использованием объектов синхронизации сравниваются с издержками простой прямой блокировки.
Прежде чем вы начнете, было бы полезно посмотреть, насколько серьезным является попадание в простую реализацию, использующую блокировку. Возможно, это не самая эффективная реализация, но если она по-прежнему работает на несколько порядков быстрее, чем вам когда-либо понадобится, то простота обслуживания (то есть любой, включая вас самих, может сейчас, просто взглянуть на код) и понять, что он делает) может перевесить крошечную долю процессорного времени, занятого в механизме организации очередей.
Надеюсь, это поможет: -)