c# - Es int? ¿a salvo de amenazas?
.net thread-safety (3)
De http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx :
Cualquier miembro público estático (Compartido en Visual Basic) de este tipo es seguro para subprocesos. No se garantiza que ningún miembro de instancia sea seguro para subprocesos.
Sé que en .Net todos los tipos de 32 bits (por ejemplo, int
, bool
, etc.) son seguros para subprocesos. Es decir, no habrá una escritura parcial (según las especificaciones).
Pero, ¿se aplica lo mismo para int?
(nullable int)?
La pregunta está mal redactada, y de ahí la confusión en las respuestas hasta el momento. La pregunta debería ser "¿se leen y escriben en una variable de tipo int? ¿Se garantiza que sea atómica ?"
No absolutamente no. La especificación es extremadamente clara en este punto:
Las lecturas y escrituras de los siguientes tipos de datos son atómicas: bool, char, byte, sbyte, short, ushort, uint, int, float y tipos de referencia. Además, las lecturas y escrituras de tipos de enumeración con un tipo subyacente en la lista anterior también son atómicas. No se garantiza que las lecturas y escrituras de otros tipos, incluidos los tipos long, ulong, double y decimal, así como los tipos definidos por el usuario, sean atómicos.
Es totalmente posible que un hilo lea un valor escrito parcialmente desde una variable de memoria compartida de tipo anulable.
Por ejemplo, supongamos que tienes un int? Variable x que actualmente tiene el valor nulo. Por lo tanto, contiene un int, establecido en cero y un bool, establecido en falso. Ahora en otro hilo escribe el int "5" anulable en x. Es perfectamente legal que otra hebra lea el int cero no anulable de x, porque el "verdadero" en el bool podría establecerse antes de que el 5 se establezca en el int.
No, ya que un int?
es en realidad una estructura ( Nullable<int>
) compuesta por un int
y un bool
.