编程语言
首页 > 编程语言> > C & python联合编程-解决PyGILState_Ensure死锁问题

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

标签:解释器,python,代码,所有,死锁,线程,Ensure,GIL
来源: https://blog.csdn.net/weixin_42605769/article/details/115032329