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析构,释放全局锁

     

  • 相关阅读:
    set 用法、小结
    AC 自动机优化
    HDU 2222 Keywords Search 【ac自动机】
    组合数学 隔板法
    BZOJ1303_中位数图_KEY
    初识Trie_对Trie的一些认识
    网络流Edmonds-Karp算法入门
    Codevs1332_上白泽慧音_KEY
    Fliptil_KEY
    2017Noip普及组游记
  • 原文地址:https://www.cnblogs.com/SZxiaochun/p/7692698.html
Copyright © 2011-2022 走看看