En la implementación actual de CPython, hay un objeto conocido como "GIL" o "Global Interpreter Lock". Es esencialmente un mutex que evita que dos subprocesos Python ejecuten el código Python al mismo tiempo. Esto evita que dos subprocesos puedan dañar el estado del intérprete de Python, pero también evita que varios subprocesos se ejecuten realmente juntos. En esencia, si hago esto:¿Cuál es la versión del GIL de C#?
# Thread A
some_list.append(3)
# Thread B
some_list.append(4)
no puede corromper la lista, ya que en un momento dado, sólo uno de esos hilos se están ejecutando, ya que deben sostener el GIL para hacerlo. Ahora, los elementos de la lista pueden agregarse en algún orden indeterminado, pero el punto es que la lista no está dañada y siempre se agregarán dos cosas.
Por lo tanto, ahora a C#. C# esencialmente enfrenta el mismo problema que Python, entonces, ¿cómo C# previene esto? También me interesaría escuchar la historia de Java, si alguien lo sabe.
Aclaración: estoy interesado en lo que sucede sin declaraciones explícitas de bloqueo, especialmente a la máquina virtual. Soy consciente de que existen primitivas de bloqueo para Java & C# - también existen en Python: GIL no se utiliza para código de subprocesos múltiples, salvo para mantener el intérprete en buen estado. Estoy interesado en el equivalente directo de lo anterior, por lo que, en C#, si puedo recordar lo suficiente ... :-)
List<String> s;
// Reference to s is shared by two threads, which both execute this:
s.Add("hello");
// State of s?
// State of the VM? (And if sane, how so?)
He aquí otro ejemplo:
class A
{
public String s;
}
// Thread A & B
some_A.s = some_other_value;
// some_A's state must change: how does it change?
// Is the VM still in good shape afterwards?
No estoy buscando para escribir el código C# malo, entiendo las declaraciones lock
. Incluso en Python, el GIL no le da código mágico multihilo: aún debe bloquear los recursos compartidos. . Pero el GIL impide "máquina virtual" de Python se corrompan - es este comportamiento que estoy interesado en
usted puede estar interesado en la sección "concurrencia" de este [comparación de Python y Clojure] (http: //www.bestinclass .dk/index.clj/2009/10/python-vs-clojure-evolving.html), para una discusión del GIL y cómo el problema de la concurrencia se maneja en idiomas sin un GIL. –
Según tengo entendido, es una solución de compromiso entre qué clase de problemas será más difícil de resolver. Ver mi respuesta a continuación. – pyfunc