É seguro ignorar a condição de corrida de leitura de um valor de ponto flutuante em mudança suave?

StackOverflow https://stackoverflow.com/questions/2340027

  •  22-09-2019
  •  | 
  •  

Pergunta

Enquanto eu tento colocar a função de atualização da animação e a simulação de física de um mecanismo de jogo em um fio separado para execução, percebo a condição de raça potencial de alguns valores de ponto flutuante (por exemplo, posição de um objeto) entre o tópico do escritor (animação, física ) e o thread do leitor (renderizador) se os dois threads acessarem os valores simultaneamente.

Minha pergunta é, dado que mesmo uma atribuição de ponto flutuante não é atômica, uma condição de corrida de leitura de leitura pode resultar em uma mudança com fio/repentino dos valores originais em mudança, como visto pelo leitor?

Além disso, na minha situação, posso tolerar uma pequena quantidade de erro, pois esse erro não se acumulará sobre o próximo quadro de renderização.

Foi útil?

Solução

Teoricamente falando, você poderia obter um grande grau de erro se houvesse uma mudança de contexto entre atualizar o expoente e atualizar o Mantissa, mas duvido que a maioria das plataformas ou arquiteturas em uso hoje permita que isso aconteça.

Outras dicas

Para minha compreensão, você pode ignorar a condição de corrida, desde que tenha apenas o thread que escrevesse a veriável de cada vez e não se importa se o (s) tópico (s) de leitura não estiver usando a versão mais recente.

Pelo meu entendimento, escrever o flutuador deve ser atômico para o seu código, embora isso possa ser dependente da plataforma, presumo.

Seção 12.5 da ECMA-334 (A especificação de idioma C#) afirma:

Leia e grava os seguintes tipos de dados devem ser atômicos: bool, char, byte, sbyte, curto, ushort, uint, int, float e tipos de referência.

Para esse fim, você não deve ver nenhuma corrupção devido a leituras e gravações de um bóia (supondo que você não signifique dobrar aqui, isso é não garantido para ser uma gravação atômica).

No entanto, o que deve ser observado é que, embora a escrita dos valores seja garantida como atômica, a ordem das leituras/gravações é não garantido a menos que você esteja usando algo específico, como uma chamada para Monitor.enter.

Monitor.enter é um pouco pesado para isso, então eu recomendaria usar o palavra -chave volátil Ao declarar a variável. Supondo que a leitura/gravação dessa variável seja a única coisa que precisa ocorrer, garantirá que as leituras/gravações sejam feitas em ordem.

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