持有CPython的GIL是否保证所有CPython的线程停止?

持有CPython的GIL是否保证所有CPython的线程停止?,python,multithreading,garbage-collection,cpython,boehm-gc,Python,Multithreading,Garbage Collection,Cpython,Boehm Gc,CPython是一个多线程应用程序,因此在Unix上它使用pthreads。比如说,用C编写的Python扩展通常需要持有GIL,以确保Python对象在代码的关键部分不会损坏。其他类型的数据呢?具体地说,在Python扩展中持有GIL是否可以保证所有其他CPython线程停止 问这个问题的原因是,我正在尝试将一个Python扩展移植到FreeBSD,它在Linux和OSX上工作,使用Boehm GC嵌入Lisp编译器/系统,并且在初始化嵌入式Boehm GC时崩溃。回溯表明,另一个线程出现了问

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

问这个问题的原因是,我正在尝试将一个Python扩展移植到FreeBSD,它在Linux和OSX上工作,使用Boehm GC嵌入Lisp编译器/系统,并且在初始化嵌入式Boehm GC时崩溃。回溯表明,另一个线程出现了问题,并造成了严重破坏。Linux上的pthread实现与FreeBSD的实现完全不同,因此也会出现这些问题。CPython中是否有另一个互斥锁可用于实现锁定

具体地说,在Python扩展中持有GIL是否可以保证所有其他CPython线程停止

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


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

CPython内部使用的互斥锁是否只有GIL?还是还有更多?不知道。回溯表明另一个线程进入并造成严重破坏。破坏什么?您是否有多个python线程扰乱了扩展的内存?我想您会使用一个python线程来初始化嵌入式解释器,即使稍后您允许多个python/系统线程使用它?这是ipython及其prompt toolkit。