As filas sem bloqueio podem ser implementadas para o caso de produtor único / consumidor único, e muitas vezes você pode arquitetar seu software para minimizar o número de filas de múltiplos produtores ou vários consumidores.
Uma fila sem bloqueio pode ser construída da seguinte forma: aloque uma matriz dos elementos a serem comunicados e também dois números inteiros, chamados Head e Tail. Head é um índice na matriz, onde o próximo item será adicionado. Tail é um índice na matriz, onde o próximo item está disponível para remoção. A tarefa do produtor lê H e T para determinar se há espaço para adicionar um item; grava o item no índice H e atualiza H. As tarefas do consumidor lê H e T para determinar se há dados disponíveis, lê dados do índice T e atualiza T. Basicamente, é um buffer de anel acessado por duas tarefas e o A ordem das operações (insira, atualize H; remova e atualize T) garante que a corrupção de dados não ocorra.
Se você tiver uma situação com vários produtores e um único consumidor, ou um único produtor e vários consumidores, terá efetivamente algum tipo de limitação de recurso e não há mais nada além de usar a sincronização, pois é mais provável que o limitador de desempenho ser o único produtor / consumidor que uma sobrecarga do SO com o mecanismo de bloqueio.
Mas se você tem vários produtores e consumidores, vale a pena gastar tempo (no espaço de design) para ver se você não consegue um mecanismo de comunicação mais coordenado; em um caso como esse, serializar tudo através de uma única fila definitivamente torna a eficiência da fila o determinante central do desempenho.