linux mysql 死锁进程_linux下进程锁重入导致的死锁

一.问题现象

客户端收不到服务端的请求,查看服务端不再响应。现将定位过程记录如下。

二.问题调试过程

使用gdb attach上该服务的进程后,发现有工作线程卡在了锁的获取上,如图

45eddd392cbffbe6e280437157f456b5.png

使用命令

ipcs -s -i 35848295

查看占有该信号量的线程,输出如图所示:

05f152bb67a654fb30a38b540925abaf.png

可以看到占有该信号量的进程是9013进程。

接着使用gdb attach上9013号进程。

其中一个线程的调用栈如图所示

5981d1aa1ac678284f9d261b4d85de2b.png

看上去,该线程也在获取锁,同时仔细观察了其他线程锁,也没找到有等待锁的地方。难道是锁重入了,继续看上面的栈帧,并对照代码排查,发现12号线程已经获取了该锁。至此问题查明。

三.修改和防范措施

windows下进程锁同一个线程内是可以重入的,linux下不可重入(可以写个简单的单线程程序验证)。在linux下,应该避免同一线程进程锁的重入。

修改方法:减少锁第一次获取时的使用范围,及时释放。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值