持有CPython的GIL可以保证所有cpython的线程停止吗?



cpython是一个多线程应用程序,因此在Unix上使用(P)线程。Python扩展(用C,例如)通常需要握住GIL,以确保Python对象不会在代码的关键部分中损坏。其他类型的数据怎么样?具体来说,在Python扩展中握住GIL是否保证CPYTHON停止的所有其他线程?

询问的原因是,我试图移植freebsd python扩展(在Linux和OSX上起作用),该扩展名使用BOEHM GC嵌入LISP编译器/系统ECL,并且在嵌入式BOEHM GC初始化期间崩溃。回程表明,另一个线程会引起并造成破坏(Linux上的Pthread实现与FreeBSD有足够的不同,也可以期待沿着这些线路发生麻烦)。CPYTHON中是否有另一个可以用来实现锁定的静音?

特别是,在python扩展中握住吉尔是否保证了所有其他cpython停止的线程?

简短的答案是否 - 如果其他线程在不持有GIL的情况下执行代码(例如,如果他们运行了释放GIL的C扩展程序),则它们将继续运行,直到尝试重新尝试GIL(通常,当他们试图将(数据)返回到Python的世界时)。

也有可能在cpython的核心部分(核心解释器和/或内置的fucntions/packages构建的核心部分可能会在您会在扩展中释放gil。我不知道他们是否真的会这样做。

最新更新