E 'sicuro di ignorare la condizione di competizione di lettura-scrittura di un valore in virgola mobile senza problemi cambiando?

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

  •  22-09-2019
  •  | 
  •  

Domanda

Mentre provo a mettere la funzione di aggiornamento animazione e fisica simulazione di un motore di gioco in un thread separato per l'esecuzione, ho realizzare il potenziale condizione di competizione di alcuni valori virgola mobile (ad esempio, la posizione di un oggetto) tra il filo scrittore ( animazione, fisica) e il filo lettore (rendering) se entrambi i fili stanno per accedere ai valori contemporaneamente.

La mia domanda è, dato che anche un incarico in virgola mobile non è atomica, sarà una tale condizione di competizione lettura-scrittura può causare una rete cablata / cambiamento improvviso dei valori originali senza problemi cambiando come si è visto dal lettore?

Inoltre, nella mia situazione posso tolleranza una piccola quantità di errore, dal momento che tale errore non si accumulano sopra la struttura di rendering successiva.

È stato utile?

Soluzione

In teoria si potrebbe ottenere un enorme grado di errore se ci fosse un cambio di contesto tra l'aggiornamento l'esponente e l'aggiornamento del mantissa, ma dubito che la maggior parte delle piattaforme o architetture in uso oggi permettere una cosa del genere accada.

Altri suggerimenti

Per la mia comprensione, è possibile ignorare la condizione di competizione fino a quando si dispone solo sul filo di scrivere il veriable alla volta e non si cura se il filo di lettura (s) non si utilizza la versione più recente.

Dalla mia comprensione, scrivendo il galleggiante dovrebbe essere atomica al codice, anche se questo potrebbe essere dipendenti dalla piattaforma presumo.

Sezione 12.5 di ECMA-334 (il linguaggio C # specifcation ) afferma:

  

legge e scrive dei seguenti dati   tipi devono essere atomica: bool, char,   Byte, sbyte, insomma, ushort, uint, int,   galleggiante, e di riferimento tipi.

A tal fine, non si dovrebbe vedere qualsiasi corruzione a causa di lettura e scrittura di un galleggiante (a patto che non vuol dire doppio qui, cioè non garantito essere una scrittura atomica).

Tuttavia, quello che dovrebbe essere notato è che, mentre la scrittura dei valori è garantito per essere atomica, l'ordine della legge / scrive è non garantito a meno che non si utilizza qualcosa di specifico, come una chiamata Monitor.Enter .

Monitor.Enter è un po 'pesante per questo, però, così mi consiglia di utilizzare il volatili parola chiave quando si dichiara la variabile. Assumendo la lettura / scrittura di questa variabile è l'unica cosa che deve accadere, si garantirà che la legge / scrive sono fatte in ordine.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top