问题遇到的现象和发生背景
为了使用 Python 调用 C++ 中写好的函数,将 C++ 函数打包成动态库文件,之后在 Python 中调用,C++ 函数中接收的参数类型存在有 unsigned char* 类型,在 Python 传入时使用 c_ubyte * 3072
代替,同时 Python 还需要获取指针被修改后的值。仅测试此部分文件,可以看到 Python 中的数组成功被 C++ 中的函数修改,但是将此部分用到 多线程程序 中,会出现段错误。是类型传递错了么。
查看 多线程程序 出错的 core 文件,发现函数在 subtype_dealloc 处出错,应该是含有调用 C++ 函数的类的实例在回收空间时出了错。
我想要达到的结果
Python程序中能够顺利回收空间,不出现 segfault,有什么好的建议么?
在使用Python调用C++函数时,需要注意Python程序运行时使用的空间与C/C++程序使用的空间互相保持一定的独立性,就是说,没有重叠的部分,因为两种程序各自回收开辟、使用的空间。在我使用Ctypes,加载编译的动态库时,单个程序不会出现问题,但是在多线程程序中,可能就会出现问题。我这里遇到的就是这样,这个可能还与所使用的机器(操作系统、甚至编译器程序?有关),在Python程序类的实例(类中有调用动态库中的C函数)回收时,出现segfault的问题。后来还是没有找到问题的具体原因,只是推测C/C++程序不可以修改Python中的变量,因为使用和修改的原因,导致内存回收冲突。
最终尝试使用为Python写C++扩展的方式,这个在Python文档中有教程,在学习和使用的过程中,也渐渐意识到自己使用ctypes导入动态库使用C/C++程序的问题所在。在调用时,C++扩展中使用的数据,是根据Python中的数据进行构造,可以理解为使用一个拷贝的数据。Python中需要得到的结果,也是根据C++程序得到的结果进行构造。如果传回的数据是对象类型,则还需要考虑引用计数的问题。