来自C++;应用程序-知道何时锁定 我试图编写一个C++类,它调用一个类的Python方法,该类同时执行一些I/O操作(文件,STDUT)。我遇到的问题是,我的类是从不同的线程调用的:有时是主线程,有时是其他线程。显然,我尝试在多线程本机应用程序中应用Python调用的方法。基本上,一切都从PyEval_AcquireLock和PyEval_ReleaseLock开始,或者只是全局锁。根据文档,当线程已经被锁定时,死锁随之发生。当从主线程或其他阻止Python执行的线程调用我的类时,会出现死锁 < Python > cSimple()-C++ FUNC,它在内部创建线程,导致“我的类”中的调用, 它在pyValueGuiReFLoD上粘贴,显然Python已经锁定,即等待C++ cSimul1调用完成…如果我省略这些锁,它就完成了。当Python解释器准备好执行下一个用户命令时,也就是线程在后台调用funcs时(而不是在本机调用内部),它也可以很好地完成
我正在寻找一个解决办法。我需要区分是否允许全局锁,即Python未被锁定并准备好接收下一个命令。。。我试过了,不幸的是我看到了绞刑 有没有已知的API或解决方案来自C++;应用程序-知道何时锁定 我试图编写一个C++类,它调用一个类的Python方法,该类同时执行一些I/O操作(文件,STDUT)。我遇到的问题是,我的类是从不同的线程调用的:有时是主线程,有时是其他线程。显然,我尝试在多线程本机应用程序中应用Python调用的方法。基本上,一切都从PyEval_AcquireLock和PyEval_ReleaseLock开始,或者只是全局锁。根据文档,当线程已经被锁定时,死锁随之发生。当从主线程或其他阻止Python执行的线程调用我的类时,会出现死锁 < Python > cSimple()-C++ FUNC,它在内部创建线程,导致“我的类”中的调用, 它在pyValueGuiReFLoD上粘贴,显然Python已经锁定,即等待C++ cSimul1调用完成…如果我省略这些锁,它就完成了。当Python解释器准备好执行下一个用户命令时,也就是线程在后台调用funcs时(而不是在本机调用内部),它也可以很好地完成,python,c++,multithreading,python-2.4,Python,C++,Multithreading,Python 2.4,我正在寻找一个解决办法。我需要区分是否允许全局锁,即Python未被锁定并准备好接收下一个命令。。。我试过了,不幸的是我看到了绞刑 有没有已知的API或解决方案 (Python 2.4)< P>除非你非常复杂地包装了C++代码,当任何Python线程调用C++代码时,吉尔是“强”保持为。您可以在C++代码中发布< /强>(如果您想做一些不需要任何Python交互的消费任务),那么当您想进行任何Python交互时,必须再次获取它——请参阅:如果您只使用了好的旧C API,那么就有宏,并且推荐的习惯
(Python 2.4)
< P>除非你非常复杂地包装了C++代码,当任何Python线程调用C++代码时,吉尔是“强”保持为。您可以在C++代码中<强>发布< /强>(如果您想做一些不需要任何Python交互的消费任务),那么当您想进行任何Python交互时,必须再次获取它——请参阅:如果您只使用了好的旧C API,那么就有宏,并且推荐的习惯用法是Py_BEGIN_ALLOW_THREADS
...Do some blocking I/O operation...
Py_END_ALLOW_THREADS
文件解释说:
将打开Py\u BEGIN\u ALLOW\u THREADS宏
一个新块并声明一个隐藏的
局部变量;这个
Py_END_ALLOW_THREADS宏关闭
块使用
这两个宏是Python
编译时没有线程支持,
它们被定义为空,因此保存
线程状态与GIL
操纵
因此,在明确发布GIL(最好是使用该宏)并需要以任何方式再次与Python交互之前,您不必(也不应该)获取GIL。(文档中说“一些阻塞I/O操作”,实际上可能是任何没有任何Python交互的长时间运行的操作)。您是否有某种消息泵,在那里发送在主线程上处理的消息?您能否澄清线程是如何产生的?它们是通过Python API生成的吗?我终于找到了我想要的解决方法。。如果(_PyThreadState_Current==NULL){state=PyGILState_sure()}。。。PyGILState_Release(state)我需要在Python中注册线程,它似乎工作正常。目前正在测试修复程序。。。