在当前的 CPython 实现中,有一个称为“GIL”或“全局解释器锁”的对象。它本质上是一个互斥体,可以防止两个 Python 线程同时执行 Python 代码。这可以防止两个线程破坏 Python 解释器的状态,但也可以防止多个线程真正一起执行。本质上,如果我这样做:
# Thread A
some_list.append(3)
# Thread B
some_list.append(4)
我不能破坏列表,因为在任何给定时间,只有一个线程正在执行,因为它们必须持有 GIL 才能这样做。现在,列表中的项目可能会以某种不确定的顺序添加,但关键是列表没有损坏,并且总是会添加两件事。
所以,现在到 C#。C# 本质上面临与 Python 相同的问题,那么,C# 是如何防止这种情况的呢?如果有人知道的话,我也有兴趣听听 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”被破坏——我感兴趣的是这种行为。