Como eu construo uma fila sem bloqueios?

Eu passei hoje olhando para filas sem bloqueios. Eu tenho um múltiplo produtor, situação de múltiplos consumidores. Implementei, para testar, um sistema usando a coisa Interlocked SList no Win32 e ele duplicou o desempenho do meu código baseado em tarefa altamente segmentado. Infelizmente, porém, desejo apoiar várias plataformas. Bloqueio em várias plataformas em si não é um problema e posso seguramente assumir que posso interligar sem problemas. No entanto, a implementação real me perde.

O grande problema parece ser que você precisa garantir que uma lista push / pop use apenas uma chamada intertravada. Caso contrário, você está deixando espaço para outro segmento para beliscar e estragar tudo. Não tenho certeza de como a implementação da microsoft funciona sob o capô e gostaria de saber mais.

Alguém pode me indicar informações úteis (plataforma e linguagem são bastante irrelevantes)?

Adicionado a isso eu adoraria saber se é possível implementar um vetor sem trava. Isso teria enormes quantidades de uso para mim :) Felicidades!

Editar: Depois de ler artigo DDJ erva eu ​​posso ver uma fila de bloqueio reduzido que é bastante semelhante ao que eu já tinha. No entanto, percebo que há papéis no final que podem fazer a verdadeira fila sem bloqueio usando uma operação double compare-and-swap (DCAS). Alguém já implementou uma fila usando cmpxchg8b (ou cmpxchg16b para esse assunto)?

Estou apenas meditando neste ponto (não tendo lido os artigos), mas você poderia usar este sistema para atualizar o ponteiro de cabeça e cauda simultaneamente e, assim, evitar quaisquer problemas com outro segmento saltando entre as duas operações atômicas. No entanto, você ainda precisa obter o próximo ponteiro para testar o ponteiro da cauda para ver se você modificou a cauda. Como você evita outro thread alterando essas informações enquanto o outro thread está se preparando para fazer isso em si? Como exatamente isso é implementado de uma maneira sem fechadura? Ou é melhor ler a indecifrabilidade que é um trabalho de pesquisa? ;)

questionAnswers(5)

yourAnswerToTheQuestion