问题描述
我正在包装使用全局定义函数作为回调的库。
void library_callback(size_t id,char *buf,size_t len);
此library_callback
函数在内部由库调用,但我可以通过公共API设置此函数。
我想创建在每次回调执行时都会被调用的侦听器(Python可调用对象)列表。
static PyObject *listeners = NULL; // initialize later as PyList_New(...)
void library_callback(size_t id,size_t len) {
for (size_t i = 0,count = PyList_Size(listeners); i < count; i++) {
PyObject *listener = PyList_GetItem(listeners,i);
// call listener with id and buf
}
}
在我用library_callback
和Py_BEGIN_ALLOW_THREADS
包装Py_END_ALLOW_THREADS
之前,它工作得很好。
但是如果没有Py_*_ALLOW_THREADS
库正在阻塞模式下工作(即使我尝试执行Thread(target=myfunc)
也是如此)。
我创建了一种简单的方法来检查问题是否与静态变量有关。
PyObject *TestObject_Test(PyObject *self,PyObject *noargs) {
static PyObject *variable = NULL;
if (variable == NULL) {
variable = PyUnicode_FromString("variable");
}
Py_BEGIN_ALLOW_THREADS
printf("variable\t%s\n",PyUnicode_AsUTF8(PyUnicode_FromFormat("%r",variable)));
Py_END_ALLOW_THREADS
return Py_INCREF(variable),variable;
}
然后在下面的代码后我得到了fish: 'python3' terminated by signal SIGSEGV (Address boundary error)
obj = TestObject()
obj.test()
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)