variable - C#volátil doble
variable volatile c (4)
La documentación volátil es de alguna manera engañosa ...
cuando la documentación de msdn dice que usa el valor más actualizado, ¿qué significa? Estoy seguro de que en un valor simple esto no lleva a confusión, pero ¿qué pasa con una referencia, como Brian Rasmussen, usted solo está hablando de la referencia, no de la instancia real (y, por lo tanto, de los datos interesantes).
Desde mi punto de vista, usar volátil no es una buena idea e iría por el candado, de todos modos este artículo podría ayudarte: http://www.bluebytesoftware.com/blog/PermaLink,guid,dd3aff8a-7f8d-4de6- a2e7-d199662b68f4.aspx
Como solo los tipos de referencia y algunos primitivos (incluido float, pero no el doble, no estoy seguro de la razón por la cual, me alegra saber por qué) pueden declararse como volátiles, si doy un doble en una clase, lo declaro como volátil (como a continuación), ¿será la propiedad doble segura para la lectura de escritura como cualquier otro volátil, o debería seguir buscando el bloqueo?
public class MyThreadedClass
{
volatile VolatileDouble voldub;
}
public class VolatileDouble
{
public double Double { get; set; }
}
Motivo por el que el doble no se puede declarar volátil: son 64 bits, lo que lo hace más que el tamaño de palabra en x86, lo que evita que se declare volátil en la CLI si no recuerdo mal.
Con su respuesta actual, solo la referencia se trata como volátil. Eso significa que el modelo de memoria se asegurará de que siempre use la referencia más reciente, pero aún podría usar un valor obsoleto.
Me gustaría ir con el bloqueo si fuera tú, pero una alternativa es usar Interlocked.Read
e Interlocked.Exchange
actuando en longs, junto con BitConverter.Int64BitsToDouble
y BitConverter.DoubleToInt64Bits
. Podría encapsular esto dentro de una estructura VolatileDouble
. (Probablemente sea una estructura en lugar de una clase).
Para que funcione como se indica arriba, debe tenerlo inmutable (sin setter), quizás con algunos operadores de conversión implícita por conveniencia. De lo contrario, las personas podrían cambiar el valor sin cambiar la referencia (volátil).
public class MyThreadedClass
{
volatile Box<double> volDouble = 123.45;
}
public class Box<T> where T : struct
{
private readonly T value;
public Box(T value) { this.value = value; }
public T Value {get {return value;}}
// explicit as nulls are a problem...
public static explicit operator T(Box<T> box) {
return box.value; }
public static implicit operator T?(Box<T> box) {
return box == null ? new T?() : new T?(box.value); }
public static implicit operator Box<T>(T value) {
return new Box<T>(value); }
public static implicit operator Box<T>(T? value) {
return value.HasValue ? new Box<T>(value.Value) : null; }
}
Más allá de eso, el bloqueo sería la mejor opción.
Usted acaba de declarar que la referencia es volátil, no la instancia, por lo que no resolverá el problema.