C++ Boost python/从线程导入模块需要ReleaseLock()。为什么?

C++ Boost python/从线程导入模块需要ReleaseLock()。为什么?,c++,c,boost-python,C++,C,Boost Python,我开发了一个带有多线程的boost.python C/C++程序 在main中,我创建了一个线程: PyEval_ pthread_create&id,&detached_attr,newThread,NULL ・在newThread中,我调用两个Py_*函数 Py_初始化 PyGILState_STATE gstate=PyGILState_sure 我在NeXType中调用一个名为霍格的C++函数: gdb回溯跟踪输出在这里 (gdb) bt #0 0x4032fe24 in __ctyp

我开发了一个带有多线程的boost.python C/C++程序

在main中,我创建了一个线程:

PyEval_

pthread_create&id,&detached_attr,newThread,NULL

・在newThread中,我调用两个Py_*函数

Py_初始化

PyGILState_STATE gstate=PyGILState_sure

我在NeXType中调用一个名为霍格的C++函数:

gdb回溯跟踪输出在这里

(gdb) bt
#0  0x4032fe24 in __ctype_b_loc () from /lib/libc.so.6
#1  0x4032fde8 in __ctype_b_loc () from /lib/libc.so.6
为什么进口失败?我不知道。请告诉我如何解决这个问题

-编辑12/12/28--

我用下面的方法解决了这个问题

主要是我执行

Py_Initialize();
PyEval_InitThreads();
PyEval_ReleaseLock();
PyGILState_STATE gstate = PyGILState_Ensure();
CALL SOME PYTHON CODE
PyGILState_Release(gstate);
然后我创建新线程。在新线程中,我执行

Py_Initialize();
PyEval_InitThreads();
PyEval_ReleaseLock();
PyGILState_STATE gstate = PyGILState_Ensure();
CALL SOME PYTHON CODE
PyGILState_Release(gstate);

但我不知道为什么现在能这样。有人能告诉我原因吗?

Python和许多其他解释语言一样,通过使用全局解释器锁或GIL来实现线程安全,它阻止两个Python解释器调用并行运行。因此,发出的任何python调用都应该首先请求锁,执行命令,然后释放锁。您必须遵守该规则,否则可能会使解释器崩溃,就像您在示例中所做的那样。请注意,函数hoge没有请求GIL,因此导致崩溃

现在,用GIL请求或确保和释放函数调用包装代码并不能解决所有问题——您仍然需要确保,当您有两个线程时,这两个线程都可以访问GIL。如果您没有在主线程上发布GIL,那么您的第二个实际执行python内容的线程将永远被阻塞!你试过了吗?如果没有,你可以试试看会发生什么


正确的解决方案(您自己找到的解决方案)是在每个线程上获取并释放GIL,并确保在其他线程饥饿时,您不会卡在具有GIL的其中一个线程中。

我建议先尝试更简单的示例。例如,尝试让代码片段在没有线程的情况下运行。一旦一切按预期运行,测试它!然后尝试多线程。谢谢你的建议。我可以解决这个问题。你是如何解决你的问题的?我也有同样的问题。。