PyGILState\u确定后再确定?

2024-04-19 20:15:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我看到python从一个复杂的基于c++的扩展模块(https://github.com/woodem/woo)关闭时崩溃。有一些被保留的共享对象被销毁,而GIL不会被删除程序自动获取(这是boost::python中的一个已知错误)。我在这些调用周围添加了PyGILState_sure/Release(使用gillockraii包装器),以便正确地销毁这些对象。然而,我现在看到的是:

    #0  0x00007ffff7bca1d4 in sem_wait@@GLIBC_2.2.5 () from /lib/x86_64-linux-gnu/libpthread.so.0
    #1  0x00000000005474c5 in PyThread_acquire_lock ()
    #2  0x0000000000539fb4 in ?? ()
    #3  0x000000000047b5ef in ?? ()
    #4  0x00007ffff18b8475 in GilLock::GilLock (this=0x7fffffffde10) at /home/eudoxos/build/woo/build-mt/dbg/include/woo/lib/pyutil/gil.hpp:9
    #5  0x00007ffff18b8869 in woo::AttrTraitBase::~AttrTraitBase (this=0x7ffff50b09c0 <GlFieldDispatcher::GlFieldDispatcher_getTrait_functors()::_tmp>, __in_chrg=<optimized out>) at /home/eudoxos/build/woo/build-mt/dbg/include/woo/lib/object/AttrTrait.hpp:43
    [...]

我想知道原因是不是因为我正在尝试在Py yu Finalize之后得到GIL。

有没有方法可以测试Py_Finalize是否有效?在API中找不到任何内容。

编辑:为了完整性,这是不首先保留GIL的回溯(有关详细信息,请参见https://github.com/boostorg/python/pull/11):

^{pr2}$

Tags: 对象inhttpsbuildgithubcomhomelib
1条回答
网友
1楼 · 发布于 2024-04-19 20:15:22

用于解释器初始化/终结的API包括Py_IsInitialized;返回Py_Initialize和{}之间的非零,以及Py_Initialize之前和之后的0。在

您必须测试竞态条件是否会把您搞砸;完全有可能您可以尝试获取GIL,另一个线程调用Py_Finalize,然后{}将锁从下面吹走。有some notes about ^{} APIs not handling the existence of multiple interpreters properly可能适用于您的场景,也可能不适用于您的场景(或者暗示可能导致我提到的推测性竞争的类似问题)。在

相关问题 更多 >