Очереди без блокировок могут быть реализованы для случая одного производителя / одного потребителя, и часто вы можете спроектировать свое программное обеспечение, чтобы минимизировать количество очередей с несколькими производителями или несколькими потребителями.
Очередь без блокировки может быть построена следующим образом: выделить массив элементов, которые необходимо передать, а также два целых числа, называть их Head и Tail. Head - это индекс в массиве, куда будет добавлен следующий элемент. Хвост - это индекс в массиве, где следующий элемент доступен для удаления. Задача производителя читает H и T, чтобы определить, есть ли место для добавления элемента; записывает элемент в индекс H, затем обновляет H. Потребительские задачи считывают H и T, чтобы определить, есть ли доступные данные, считывают данные из индекса T, затем обновляют T. По сути, это кольцевой буфер, к которому получают доступ две задачи, и порядок операций (вставка, затем обновление H; удаление, затем обновление T) гарантирует, что повреждение данных не произойдет.
Если у вас есть ситуация с несколькими производителями и одним потребителем, или с одним производителем и несколькими потребителями, у вас фактически есть какое-то ограничение ресурсов, и для него нет ничего другого, кроме как использовать синхронизацию, поскольку ограничитель производительности с большей вероятностью быть одиноким производителем / потребителем, чем издержки ОС с механизмом блокировки.
Но если у вас есть несколько производителей и потребителей, стоит потратить время (в пространстве дизайна), чтобы увидеть, не можете ли вы получить более скоординированный механизм коммуникации; в таком случае сериализация всего через одну очередь определенно делает эффективность очереди центральным фактором, определяющим производительность.