Nell'attuale implementazione di CPython, esiste un oggetto noto come "GIL" o "Global Interpreter Lock". È essenzialmente un mutex che impedisce a due thread Python di eseguire il codice Python contemporaneamente. Questo impedisce a due thread di essere in grado di corrompere lo stato dell'interprete Python, ma impedisce anche l'esecuzione di più thread contemporaneamente. In sostanza, se faccio questo:Qual è la versione di GIL di C#?
# Thread A
some_list.append(3)
# Thread B
some_list.append(4)
non può corrompere la lista, perché in un dato momento, solo uno di questi fili sono in esecuzione, dal momento che devono essere in possesso della GIL a farlo. Ora, gli elementi nell'elenco potrebbero essere aggiunti in un ordine indeterminato, ma il punto è che l'elenco non è danneggiato e verranno aggiunti sempre due elementi.
Quindi, ora C#. C# essenzialmente affronta lo stesso problema di Python, quindi, come C# impedisce questo? Sarei anche interessato ad ascoltare la storia di Java, se qualcuno lo sa.
Precisazione: Mi interessa ciò che accade, senza dichiarazioni di chiusura esplicite, soprattutto alla VM. Sono a conoscenza del fatto che esistono primitive di blocco sia per Java & C#, che esistono anche in Python: GIL non è usato per il codice multi-thread, se non per mantenere l'interprete sano di mente. Sono interessato l'equivalente diretta di quanto sopra, quindi, in C#, se riesco a ricordare abbastanza ... :-)
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?)
Ecco un altro esempio:
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?
Io non sto cercando per scrivere codice C# errato, capisco le dichiarazioni lock
. Anche in Python, GIL non ti dà codice magic-multi-thread: devi comunque bloccare le risorse condivise. . Ma la GIL impedisce "VM" di Python dalla corruzione - è questo comportamento che mi interessa
si può essere interessati nella sezione "concorrenza" di questo [confronto di Python e Clojure] (http: //www.bestinclass .dk/index.clj/2009/10/python-vs-clojure-evolving.html), per una discussione su GIL e su come il problema della concorrenza viene gestito in lingue senza GIL. –
La mia comprensione è che si tratta di un compromesso tra quale classe di problemi sarà più onerosa da risolvere. Vedi la mia risposta qui sotto. – pyfunc