CPython の現在の実装には、「GIL」または「Global Interpreter Lock」と呼ばれるオブジェクトがあります。これは基本的に、2 つの Python スレッドが同時に Python コードを実行するのを防ぐミューテックスです。これにより、2 つのスレッドが Python インタープリターの状態を破壊することを防ぎますが、複数のスレッドが実際に一緒に実行されることも防ぎます。基本的に、これを行うと:
# Thread A
some_list.append(3)
# Thread B
some_list.append(4)
リストを壊すことはできません。なぜなら、実行するスレッドは GIL を保持している必要があるためです。ここで、リスト内の項目が不定の順序で追加される可能性がありますが、ポイントは、リストが破損していないことであり、常に 2 つのものが追加されます。
では、C# に移ります。C# は基本的に Python と同じ問題に直面しています。誰かがそれを知っているなら、私はJavaの話を聞くことにも興味があります.
明確化:特に VM に対して、明示的なロック ステートメントなしで何が起こるかに興味があります。Java と C# の両方にロック プリミティブが存在することは承知しています。それらは Python にも存在します。GIL は、インタープリターを正常に保つ以外に、マルチスレッド コードには使用されません。上記の直接の同等物に興味があるので、十分に覚えていれば、C# で... :-)
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?)
別の例を次に示します。
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?
私は悪い C# コードを書くつもりはありませんlock
。ステートメントを理解しています。Python でも、GIL は魔法のようなマルチスレッド コードを提供しません。共有リソースをロックする必要があります。しかし、GIL は Python の「VM」が破損するのを防ぎます。私が興味を持っているのはこの動作です。