C++ Boost python/从线程导入模块需要ReleaseLock()。为什么?
我开发了一个带有多线程的boost.python C/C++程序 在main中,我创建了一个线程: PyEval_ pthread_create&id,&detached_attr,newThread,NULL ・在newThread中,我调用两个Py_*函数 Py_初始化 PyGILState_STATE gstate=PyGILState_sureC++ 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
我在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的其中一个线程中。我建议先尝试更简单的示例。例如,尝试让代码片段在没有线程的情况下运行。一旦一切按预期运行,测试它!然后尝试多线程。谢谢你的建议。我可以解决这个问题。你是如何解决你的问题的?我也有同样的问题。。