Thread safe tips for python extending

 
     其实习惯了用python写一些单线程的扩展,所以一直没有遇到这种问题

     今天在写一个python的扩展模块的时候遇到一个问题. 通过 python启动了一个c++的线程,这个c++线程会回调python的一个接口.调试了很久一直没有意识到是线程安全的原因,因为 c++的线程在调用  python的vm的pyobject时.并不是线程安全的.所以当c++线程直接去操作 vm的某一个object就很有导致出错.
   
     我搜索了资料 在 http://www.python.org/dev/peps/pep-0311/ 有讲到如何同步python的vm. 有两个函数可以做到锁定vm,与c++线程同步.也就是所谓的 GIL(Global Interpreter Lock).
    有两种方法来做到: 
    1 .Py_BEGIN_ALLOW_THREADS,Py_END_ALLOW_THREADS 这一对宏
    2. PyGILState_Ensure 与 PyGILState_Release
 
    不过似乎我的Py_BEGIN_ALLOW_THREADS不太好用,我也就没有去深究,因为PyGILState_Ensure就够了.没有太多的时候去研究文档,先用了回过头有时间再研究.
  
   看看我的示例代码:

#include "Python.h"
#include "ceval.h"

class PyGILHelper
{
public:
   PyGILHelper():
   mState (PyGILState_Ensure())
   {
   }
   ~PyGILHelper()
   {
      PyGILState_Release(mState);
   }
protected:
   PyGILState_STATE mState;
};


用法很简单:

PyGILHelper lock;
// some c api code



   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值