C++多線程中調用python api函數


錯誤場景:一直等待全局鎖。

  

解決方法:

一、首先定義一個封裝類,主要是保證PyGILState_Ensure, PyGILState_Release配對使用,而且這個類是可以嵌套使用的。

#include <python.h>

class PyThreadStateLock
{
public:
    PyThreadStateLock(void)
    {
        state = PyGILState_Ensure( );
    }

    ~PyThreadStateLock(void)
    {
         PyGILState_Release( state );
    }
private:
    PyGILState_STATE state;
};


二、在主線程中,這樣處理

   // 初始化
    Py_Initialize();
    // 初始化線程支持
    PyEval_InitThreads();
    // 啟動子線程前執行,為了釋放PyEval_InitThreads獲得的全局鎖,否則子線程可能無法獲取到全局鎖。
    PyEval_ReleaseThread(PyThreadState_Get());
    
    // 其他的處理,如啟動子線程等
    ......
        
    // 保證子線程調用都結束后
    PyGILState_Ensure();
    Py_Finalize();
    // 之后不能再調用任何python的API

 

三、在主線程,或者子線程中,調用python本身函數的都采用如下處理

    {
        class PyThreadStateLock PyThreadLock;  //獲取全局鎖
        // 調用python的API函數處理
        ......
    }
   //作用域結束,PyThreadLock析構,釋放全局鎖

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM