zoukankan      html  css  js  c++  java
  • 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析构,释放全局锁

     

  • 相关阅读:
    各种知识点
    链表
    滑动窗口
    数组

    【转】无重复字符的最长子串
    【转】荷兰国旗问题 三指针排序
    【转】回溯思想团灭排列、组合、子集问题
    【LeetCode】45. 跳跃游戏 II
    动态分配内存初始化二维数组
  • 原文地址:https://www.cnblogs.com/SZxiaochun/p/7692698.html
Copyright © 2011-2022 走看看