Me han planteado creer que si varios subprocesos pueden acceder a una variable, todas las lecturas y escrituras en esa variable deben estar protegidas por un código de sincronización, como una instrucción de "bloqueo", porque el procesador podría cambiar a otro subproceso a la mitad de una escritura.¿Está accediendo a una variable en C# una operación atómica?
Sin embargo, yo estaba mirando a través System.Web.Security.Membership usando Reflector y encontré código como este:
public static class Membership
{
private static bool s_Initialized = false;
private static object s_lock = new object();
private static MembershipProvider s_Provider;
public static MembershipProvider Provider
{
get
{
Initialize();
return s_Provider;
}
}
private static void Initialize()
{
if (s_Initialized)
return;
lock(s_lock)
{
if (s_Initialized)
return;
// Perform initialization...
s_Initialized = true;
}
}
}
Por qué se lee el campo s_Initialized exterior de la cerradura? ¿No podría otro hilo estar tratando de escribir al mismo tiempo? ¿Las lecturas y escrituras de las variables son atómicas?
Para aquellos de ustedes leyendo esta publicación, ya que * actualmente * existe, es un poco confuso. El código anterior se ha ajustado para mostrar una forma ** correcta ** de verificar dos veces con un bloqueo (dentro y fuera). Sin embargo, el texto de la pregunta se refiere a la muestra del código inicial que no incluía la segunda verificación 's_initialized'. Es un poco confuso sin mirar el historial de edición. – GEEF
@GEEF Disculpe la confusión, pero la pregunta SÍ se refiere al código actual, incluido el segundo control dentro del 'bloqueo'. Esta no es una pregunta sobre cómo hacer el bloqueo de doble verificación, sino sobre el acceso a la memoria atómica y si se puede escribir un booleano al mismo tiempo que se lee. –