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.

Foi útil?

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)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top