首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SWIG C++ Python多态性与多线程

SWIG C++ Python多态性与多线程
EN

Stack Overflow用户
提问于 2012-03-05 15:35:41
回答 1查看 3.1K关注 0票数 7

我正在使用C++将第三方大口包集成到python应用程序。包通过网络连接到专有API并接收更新。总的流程是python实例化一个C++对象,调用它的函数来设置它,然后等待更新。

我使用斯威格导演特写实现了更新的回调机制,在从python或python调用的C++函数进行测试时,它工作得很好。也就是说,我能够继承Python中的C++类,从C++调用它的虚拟函数,并看到python代码获得优先级并执行。

问题:

当我从网络接收到更新时,我得到:

代码语言:javascript
运行
复制
The thread 'Win32 Thread' (0x1f78) has exited with code 0 (0x0).
Unhandled exception at 0x1e0650cb in python.exe: 0xC0000005: Access violation writing location 0x0000000c.

此异常是在调用回调函数时从python27.dll内部抛出的。

我的怀疑是:我违反了http://wiki.python.org/moin/GlobalInterpreterLock

AFAIU更新来自不同的线程,并使用该线程调用python的代码。

在这一点上,我不知所措。SWIG的指导特性是否仅限于在python中启动的流(即来自python托管线程)?

我怎么才能避开这一切?如何诱导从C++到python的更新?可以喝一口吗?

我应该用完全不同的方法吗?

我愿意就这件事提出任何建议.

EN

回答 1

Stack Overflow用户

发布于 2012-06-30 18:08:43

如果您的SWIG包装的C++代码在线程中调用回调例程,那么可能没有GIL问题--SWIG生成的代码不会执行我见过的任何GIL管理,这意味着当Python调用C++代码时,在整个调用过程中保留GIL。

但是,如果您的C++代码将回调延迟到另一个线程,那么很可能违反了GIL。这非常简单:在调用回调之前,调用PyGILState_Ensure(),当回调完成时,调用PyGILState_Release。请参阅http://docs.python.org/c-api/init.html一节“非Python创建的线程”。(如果您在这里使用C++异常处理,您可能需要格外小心,以确保您可以释放GIL。)

如果您尚未查看堆栈跟踪,则值得验证的是,空指针deref并不是代码中发生的傻事。(您可以附加到使用VS/GDB/WinDBG运行代码的Python进程;Python的执行仍然无法理解,但您可以这样跟踪C++代码。)

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9569372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档