¿El bloqueo (objlocker) hace que esa aplicación sea segura para todos los subprocesos? ¿Y los miembros estáticos son seguros para subprocesos automáticamente?

StackOverflow https://stackoverflow.com/questions/274344

Pregunta

Cuando bloquea un objeto, ¿se bloquea ese objeto en toda la aplicación?

Por ejemplo, este fragmento de C # 3.0 en una sección de cáscara de nuez 19.6.1 " Thread Safety y .NET Framework Tipos " ;:

static void AddItems(  )
  {
    for (int i = 0; i < 100; i++)
      lock (list)
        list.Add ("Item " + list.Count);

    string[] items;
    lock (list) items = list.ToArray(  );
    foreach (string s in items) Console.WriteLine (s);
  }

¿El primer bloqueo:

lock (list)
        list.Add ("Item " + list.Count);

evitar que otro hilo acceda:

lock (list) items = list.ToArray(  );

¿o ambos pueden ejecutarse al mismo tiempo?

¿Y el CLR automáticamente hace que sus métodos estáticos sean seguros? ¿O depende del desarrollador?

Gracias John

¿Fue útil?

Solución

class UsefulStuff {
    object _TheLock = new object { };
    public void UsefulThingNumberOne() {
        lock(_TheLock) {
            //CodeBlockA
        }
    }
    public void UsefulThingNumberTwo() {
        lock(_TheLock) {
            //CodeBlockB
        }
    }
}

CodeBlockA y CodeBlockB no pueden ejecutarse al mismo tiempo en diferentes subprocesos, porque ambos están bloqueados en la misma instancia de objeto _TheLock .

Los métodos en _TheLock en sí no se ven afectados por completo.

Otros consejos

Otra cosa a tener en cuenta es que los constructores estáticos SON ejecutados de manera segura por el tiempo de ejecución. Si está creando un singleton y lo declara como:

public class Foo
{
    private static Foo instance = new Foo();

    public static Foo Instance
    {
        get { return instance; }
    }
}

Entonces será seguro para subprocesos. Sin embargo, si crea una instancia de un nuevo Foo dentro del instalador, deberá escribir su propia seguridad de subprocesos (es decir, bloquear un objeto)

El CLR no hace automáticamente que los métodos estáticos sean seguros para subprocesos; debes hacerlo tú mismo.

lock (list) usa ese objeto como lock, por lo que si un hilo diferente llega a otro punto con lock (list) (con el mismo objeto 'list'), el otro hilo se bloqueará hasta que el primer hilo libere el bloqueo.

Para ser claros, lock (foo) no "bloquea el objeto foo", sino que adquiere el bloqueo asociado con el objeto foo para que la sección crítica (la declaración en la construcción "lock (o) stmt" ;) se ejecuta solo cuando el hilo actual ha adquirido el bloqueo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top