Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.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+中嵌入Python+;运行期间发生崩溃_Python_C++_Multithreading_Python C Api - Fatal编程技术网

在C+中嵌入Python+;运行期间发生崩溃

在C+中嵌入Python+;运行期间发生崩溃,python,c++,multithreading,python-c-api,Python,C++,Multithreading,Python C Api,这个问题我已经讨论太久了。现在我搜索了一下,它工作了一段时间,但后来它在一个随机的地方坠毁了。我认为问题在于僵局之类的 请告诉我我做错了什么: 我创建一个全局变量: static int gil_init = 0; 在程序开始时,我调用Py\u Initialize()。这个start函数在一个会话中被多次调用,但是由于Py\u Initialize()是非操作函数,如果Python已经初始化,我认为这里没有问题 从三个函数中,我对Python/capi函数进行了大量调用-py_embed

这个问题我已经讨论太久了。现在我搜索了一下,它工作了一段时间,但后来它在一个随机的地方坠毁了。我认为问题在于僵局之类的

请告诉我我做错了什么:

  • 我创建一个全局变量:

    static int gil_init = 0; 
    
  • 在程序开始时,我调用
    Py\u Initialize()
    。这个start函数在一个会话中被多次调用,但是由于
    Py\u Initialize()
    是非操作函数,如果Python已经初始化,我认为这里没有问题

  • 从三个函数中,我对Python/capi函数进行了大量调用-
    py_embed(…)
    (一次只调用一个函数)。下一个代码出现在从每个线程调用的
    py_embed()
    函数中:

    if (!gil_init) {
        gil_init = 1;
        PyEval_InitThreads();
        PyEval_SaveThread();
    }
    state = PyGILState_Ensure();
    // Call Python/C API functions...
    //pValue= PyObject_CallObject(pFunc, pArgs2);  Crash is always given here
    PyGILState_Release(state);
    
  • 哦,崩溃发生在其中一个函数中,但这不是我第一次调用它,这很奇怪。这就是为什么我说它在运行时间的随机位置

    在理论上,并在参考手册的基础上,它应该是有效的。。我做错了什么

    编辑:我不调用
    Py_Finalize()
    ,因为我有

    看看,它帮助我解决了一些线程问题。特别是本部分:

    尽管如此,我发现这可能导致间歇性的 死锁。似乎每个
    PyThreadState
    都由
    PyGILState\u sure()
    不是唯一的,导致多个线程 试图还原相同的
    PyThreadState
    ,导致死锁。 通过保证每个线程都具有 它自己的
    PyThreadState
    。部分解决方案如下所示:

    我想我解决了它(不能肯定,但直到现在它还没有崩溃)


    问题是我在取消一些借来的参考资料。我注意到这一点是因为一些对象的引用计数是2或3。

    Ty用于注释。不幸的是,这不起作用。我设置了多个断点,我注意到当它到达
    m_state=PyThreadState_New(m_解释器状态)时它停止了。。。因此,python脚本甚至还没有到达
    
     // Once in each thread
     m_state = PyThreadState_New(m_interpreterState);
     PyEval_RestoreThread(m_state);
    
     // Perform some Python actions here
    
     // Release Python GIL
     PyEval_SaveThread();