C & python联合编程-解决PyGILState_Ensure死锁问题

GIL锁机制

GIL本质就是一把互斥锁,既然是互斥锁,所有互斥锁的本质都一样,都是将并发运行变成串行,以此来控制同一时间内共享数据只能被一个任务所修改,进而保证数据安全。保护不同的数据的安全,就应该加不同的锁。
  每执行一个python程序,就是开启一个进程,在一个python的进程内,不仅有其主线程或者由该主线程开启的其他线程,还有解释器开启的垃圾回收等解释器级别的线程,所有的线程都运行在这一个进程内,所以:
1、所有数据都是共享的,这其中,代码作为一种数据也是被所有线程共享的(test.py的所有代码以及Cpython解释器的所有代码)
2、所有线程的任务,都需要将任务的代码当做参数传给解释器的代码去执行,即所有的线程要想运行自己的任务,首先需要解决的是能够访问到解释器的代码。
(摘自https://blog.csdn.net/qq_17513503/article/details/81062510)

PyGILState_Ensure获取不到锁的问题典型示例以及解决方法:

PyGILState_Ensure一般用在面向C语言的回调函数调用python的函数对象之前,在调用它时,会向python解释器请求GIL资源,此时如果刚好有一个python函数已经获取了GIL,且需要等待回调函数执行完毕才能退出。如下图所示。
image.png
这种情况就会导致死锁,卡在func等待回调执行完毕这里。所以在这种情况下,需要使python解释器调用的函数先释放GIL,等待回调结束后,再执行。
示例:
image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值