c++ - 如何从外语线程调用python函数(C++)

标签 c++ python multithreading boost locking

我正在开发一个使用 DirectShow 从中获取音频数据的程序 媒体文件。 DirectShow 使用线程将音频数据传递给回调 函数在我的程序中,我让那个回调函数调用另一个 Python 中的函数。

我使用 Boost.Python 包装我的库,回调函数:

class PythonCallback {
private:
    object m_Function;
public:
    PythonCallback(object obj)
        : m_Function(obj)
    {}

    void operator() (double time, const AudioData &data) {
        // Call the callback function in python
        m_Function(time, data);
    }

};

问题来了,DirectShow的一个线程调用了我的 PythonCallback,即调用Python中的函数。一旦它调用,我的 程序刚刚崩溃。我发现这应该是线程问题。然后我 找到这个文件:

http://docs.python.org/c-api/init.html

看来我的程序不能从线程调用Python的函数 直接,因为有全局解释器锁。 python 的 GIL 太复杂了,我不知道它是如何工作的。对不起,我能做什么 是问。我的问题是。打电话之前和之后我应该做什么 来自线程的 Python 函数?

它可能看起来像这样。

void operator() (double time, const AudioData &data) {
    // acquire lock
    m_Function(time, data);
    // release lock
}

谢谢。 维克托·林。

最佳答案

查看来自 PEP 311 的 PyGILState_Ensure()/PyGILState_Release() http://www.python.org/dev/peps/pep-0311/

这是从 PEP 本身获取的示例:

void SomeCFunction(void)
{
    /* ensure we hold the lock */
    PyGILState_STATE state = PyGILState_Ensure();
    /* Use the Python API */
    ...
    /* Restore the state of Python */
    PyGILState_Release(state);
}

关于c++ - 如何从外语线程调用python函数(C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/510085/

相关文章:

python - 删除空行 - openpyxl

multithreading - delphi xe下服务应用程序中的线程不起作用

java - 加入两个不同的ExecutorService

python - opencv消除噪音/用canny检测网络

c++ - 为什么 0x82 比 0x80 小?

c++ - 在 cout << "hello"<< endl 中删除 endl 后,我的 C++ 程序停止工作

c++ - pthread 堆栈变量内存泄漏

python - "Dropout"、 "Monte-Carlo Dropout"和 "Channel-wise Dropout"有什么区别?

java arraylist通过java 8中的remove方法返回相同的对象

c++ - 空间 vector 、颜色 vector