Aggiornamento: Ho appena imbattuto in questo in Eric Lippert's answer-another question (che sta citando la specifica):Sta leggendo un doppio non thread-safe?
Legge e scrive di altri tipi, compreso lunga, ulong, doppio, e decimale, come pure come tipi definiti dall'utente , non è garantito l'atomico .
OK, quindi la lettura di un double
è non atomica. Ciò significa che il valore potrebbe essere modificato in lettura centrale, giusto? Quindi, come si legge un valore double
atomicamente?
ho notato c'è un metodo per Interlocked.Read
long
valori. Questo ha senso per me, poiché la lettura di un valore a 64 bit richiede due passaggi e pertanto è soggetta alle condizioni di gara, proprio come ogni altra azione non atomica.
Ma non ci sono valori Interlocked.Read
per double
, anche se System.Double
è un valore a 64 bit.
sto vedendo un po 'strani comportamenti nel mio programma in cui la mia interfaccia grafica, che mostra una double
in una casella di testo mentre quella double
viene anche aggiornato frequentemente da altri thread, sta mostrando il valore corretto (in prossimità di 200,0) più del tempo e quindi a caso mostrando un valore errato (come -0.08) occasionalmente.
Forse questo è un problema di threading, o forse è qualcos'altro. Ma prima volevo restringere le possibilità. Quindi: sta leggendo un double
thread-safe?
Ricorda che anche se la lettura è atomica, non ti aiuterà se la scrittura non lo è. – nos
@nos: giusto. Ma è strano perché la classe 'Interlocked' * fornisce * operazioni di scrittura atomica:' Exchange' e 'CompareExchange' accettano entrambi argomenti' double'. –
@Dan, in risposta alla domanda di follow-up nella modifica, vedere la risposta di Jon Skeet [risposta a un'altra domanda qui] (http://stackoverflow.com/questions/531759/c-volatile-double/531772#531772), in cui suggerisce di usare 'BitConverter' per spostarsi tra long e double (in congiunzione con' Interlocked.Read'). –