O que aconteceria em um objeto de fila .NET não segura?
-
20-09-2019 - |
Pergunta
Eu tenho um objeto de fila .NET. O thread do produtor executa a operação de enquadança, os dados envolvidos na fila é uma matriz de byte [], enquanto o outro thread do consumidor faz a operação de dequeue no mesmo objeto de fila.
Eu uso bloqueios para lidar com simultaneidade. Meu código parece funcionar bem o tempo todo, mas ontem, coisas estranhas aconteceram. Os dados que obtive de um tópico de consumo foram diferentes dos dados que eu produzi: o comprimento da matriz errado 、 Array repetido ... Isso é causado pela proteção falhada na segura do fio?
Na minha opinião, a concorrência causaria apenas perda de dados.
Meu primeiro post aqui, tenha paciência comigo.
Solução
É muito pior que a simples perda de dados. A classe da fila pode re-alocar seu buffer interno quando necessário para acomodar um número crescente de elementos. O bloqueio inadequado pode acessar o novo buffer com valores antigos dos índices de cabeça e cauda. Você só terá uma exceção quando tiver sorte, é mais provável que você simplesmente obtenha o elemento errado.
Outras dicas
O thread do produtor não deve manter uma referência à matriz e modificá -lo após a formação. Sempre crie uma nova matriz. (Posso estar afirmando o óbvio, mas é difícil fazer melhor sem mais informações)