Tha*_*tos 8 c# python java gil
在CPython的当前实现中,存在称为"GIL"或"Global Interpreter Lock"的对象.它本质上是一个互斥锁,可以防止两个Python线程同时执行Python代码.这可以防止两个线程破坏Python解释器的状态,但也可以防止多个线程真正一起执行.基本上,如果我这样做:
# Thread A
some_list.append(3)
# Thread B
some_list.append(4)
Run Code Online (Sandbox Code Playgroud)
我无法破坏列表,因为在任何给定时间,只有其中一个线程正在执行,因为它们必须持有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?)
Run Code Online (Sandbox Code Playgroud)
这是另一个例子:
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?
Run Code Online (Sandbox Code Playgroud)
我不打算写坏C#代码,我理解这些lock陈述.即使在Python中,GIL也不会为您提供神奇的多线程代码:您仍然必须锁定共享资源.但是GIL阻止了Python的"VM"被破坏 - 这是我感兴趣的行为.
Ign*_*ams 11
大多数支持线程的其他语言都没有Python GIL的等价物; 它们要求您隐式或显式地使用互斥锁.
使用锁,你可以这样做:
lock(some_list)
{
some_list.Add(3);
}
Run Code Online (Sandbox Code Playgroud)
在线程 2 中:
lock(some_list)
{
some_list.Add(4);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,该lock语句确保该lock语句内的对象some_list一次只能由一个线程访问。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/c5kehkcz(VS.80).aspx 。