我正在开发一个程序,使用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的函数
直接,因为有Global Interpreter Lock. 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);
}