0

CPython 是一个多线程应用程序,因此在 Unix 上它使用 (p) 线程。Python 扩展(比如用 C 语言编写)通常需要持有 GIL 以确保 Python 对象不会在代码的关键部分损坏。其他类型的数据呢?具体来说,在 Python 扩展中持有 GIL 是否保证 CPython 的所有其他线程都停止?

询问的原因是我试图将 Python 扩展(适用于 Linux 和 OSX)移植到 FreeBSD,该扩展使用 Boehm GC 嵌入 Lisp 编译器/系统ECL,并且在嵌入式 Boehm GC 的初始化期间崩溃。回溯表明另一个线程启动并造成严重破坏(Linux 上的 pthread 实现与 FreeBSD 的实现有很大不同,因此预计也会出现这些问题)。CPython 中是否有另一个互斥锁可用于实现锁定?

4

1 回答 1

1

具体来说,在 Python 扩展中持有 GIL 是否保证 CPython 的所有其他线程都停止?

简短的回答是否定的——如果其他线程在不持有 GIL 的情况下执行代码(例如,如果它们正在运行释放 GIL 的 C 扩展),那么它们将继续运行直到尝试重新获取 GIL(通常当它们尝试将(数据)返回到 python 的世界)。

CPython 的核心部分(核心解释器和/或内置函数/包)也有可能在与扩展中类似的情况/原因下释放 GIL。我不知道他们是否真的这样做。

于 2017-09-22T14:19:00.923 回答