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

C & python联合编程-解决PyGILState_Ensure死锁问题,第1张

概述GIL锁机制GIL本质就是一把互斥锁,既然是互斥锁,所有互斥锁的本质都一样,都是将并发运行变成串行,以此来控制同一时间内共享数据只能被一个任务所修改,进而保证数据安全。保护不同的数据的安全,就应该加不同的锁。每执行一个python程序,就是开启一个进程,在一个python的进程内,不

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,且需要等待回调函数执行完毕才能退出。如下图所示。


这种情况就会导致死锁,卡在func等待回调执行完毕这里。所以在这种情况下,需要使python解释器调用的函数先释放GIL,等待回调结束后,再执行。
示例:

总结

以上是内存溢出为你收集整理的C & python联合编程-解决PyGILState_Ensure死锁问题全部内容,希望文章能够帮你解决C & python联合编程-解决PyGILState_Ensure死锁问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1188469.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存