客户端收不到服务端的请求,查看服务端再也不响应。现将定位过程记录以下。linux
使用gdb attach上该服务的进程后,发现有工做线程卡在了锁的获取上,如图windows
该进程的15号线程,停在了获取锁上,切到该线程的第3帧,查看该信号量的信息,如图spa
使用命令ipcs -s -i 35848295
查看占有该信号量的线程,输出如图所示:线程
能够看到占有该信号量的进程是9013进程。调试
接着使用gdb attach上9013号进程。
其中一个线程的调用栈如图所示code
看上去,该线程也在获取锁,同时仔细观察了其余线程锁,也没找到有等待锁的地方。难道是锁重入了,继续看上面的栈帧,并对照代码排查,发现12号帧已经获取了该锁。至此问题查明。blog
windows下进程锁同一个线程内是能够重入的,linux下不可重入(能够写个简单的单线程程序验证)。在linux下,应该避免同一线程进程锁的重入。
修改方法:减小锁第一次获取时的使用范围,及时释放。进程