actualización: Me tropecé con esto en Eric Lippert's answer-another question (que está citando la especificación):¿Está leyendo un doble que no es seguro para subprocesos?
Lee y escribe de otros tipos, incluyendo larga, ulong, dobles, y decimal, así como los tipos definidos por el usuario , no se garantiza que sean atómicos.
OK, así que la lectura de un double
es no atómica. Esto significa que el valor podría modificarse a mitad de la lectura, ¿verdad? Entonces, ¿cómo se lee un valor double
atómicamente?
noto que hay un método para Interlocked.Read
long
valores. Esto tiene sentido para mí, ya que leer un valor de 64 bits debe requerir dos pasos y, por lo tanto, estar sujeto a las condiciones de carrera como cualquier otra acción no atómica.
Pero no hay valores Interlocked.Read
para double
, aunque System.Double
tiene un valor de 64 bits.
estoy viendo un comportamiento extraño en mi programa en mi interfaz gráfica de usuario, que muestra una double
en un cuadro de texto, mientras que double
también está siendo actualizada con frecuencia por otros hilos, está mostrando el valor correcto (en las proximidades de 200,0) la mayoría de las veces, y luego muestra aleatoriamente un valor erróneo (como -0.08) ocasionalmente.
Tal vez este es un problema de rosca, o tal vez algo más. Pero primero quería reducir las posibilidades. Entonces: ¿está leyendo un double
thread-safe?
Tenga en cuenta que incluso si la lectura es atómica, no lo ayudará si no lo está. – nos
@nos: Correcto. Pero es extraño porque la clase 'Interlocked' * does * proporciona operaciones de escritura atómica:' Exchange' y 'CompareExchange' ambos aceptan argumentos' dobles'. –
@Dan, en respuesta a la pregunta de seguimiento en su edición, vea la respuesta de Jon Skeet [aquí a otra pregunta] (http://stackoverflow.com/questions/531759/c-volatile-double/531772#531772), en el que sugiere usar 'BitConverter' para moverse entre long y double (en conjunción con' Interlocked.Read'). –