Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
来自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 - Fatal编程技术网

来自C++;应用程序-知道何时锁定 我试图编写一个C++类,它调用一个类的Python方法,该类同时执行一些I/O操作(文件,STDUT)。我遇到的问题是,我的类是从不同的线程调用的:有时是主线程,有时是其他线程。显然,我尝试在多线程本机应用程序中应用Python调用的方法。基本上,一切都从PyEval_AcquireLock和PyEval_ReleaseLock开始,或者只是全局锁。根据文档,当线程已经被锁定时,死锁随之发生。当从主线程或其他阻止Python执行的线程调用我的类时,会出现死锁 < Python > cSimple()-C++ FUNC,它在内部创建线程,导致“我的类”中的调用, 它在pyValueGuiReFLoD上粘贴,显然Python已经锁定,即等待C++ cSimul1调用完成…如果我省略这些锁,它就完成了。当Python解释器准备好执行下一个用户命令时,也就是线程在后台调用funcs时(而不是在本机调用内部),它也可以很好地完成

来自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未被锁定并准备好接收下一个命令。。。我试过了,不幸的是我看到了绞刑

有没有已知的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中注册线程,它似乎工作正常。目前正在测试修复程序。。。