gpt4 book ai didi

c# - C# 的 GIL 版本是什么?

转载 作者:太空狗 更新时间:2023-10-29 20:39:10 25 4
gpt4 key购买 nike

在当前的 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”被破坏——我感兴趣的正是这种行为。

最佳答案

大多数其他支持线程的语言都没有 Python GIL 的等价物;它们要求您隐式或显式地使用互斥量。

关于c# - C# 的 GIL 版本是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4026238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com