持有CPython的GIL能保证所有cpython的线程都停止吗?

时间:2017-09-22 14:09:42

标签: python multithreading garbage-collection cpython boehm-gc

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

问的原因是我试图向FreeBSD移植一个Python扩展(适用于Linux和OSX),它使用Boehm GC嵌入一个Lisp编译器/系统ECL,并在初始化过程中崩溃嵌入式Boehm GC。 Backtraces建议另一个线程开始并导致破坏(Linux上的pthread实现与FreeBSD的完全不同,以及在这些方面也存在问题)。 CPython中是否有另一个可用于实现锁定的互斥锁?

1 个答案:

答案 0 :(得分:1)

  

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

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

CPython的核心部分(核心解释器和/或内置的函数/软件包)可能会在类似的情况/原因中释放GIL,这也可能会在扩展中执行。我不知道是否他们确实这样做。