一、现象描述客户端收不到服务器的请求,服务器不再响应。现将定位过程记录如下。2、问题调试过程中,在gdbattach上使用服务的进程后,发现有一个工作线程卡在了锁的获取上。如图所示,进程的15号线程在获取锁上停止,切换到该线程的第三个线程。帧,查看信号量的信息,如图,使用命令ipcs-s-i35848295查看占用信号量的线程,输出如图:可以看到占用的进程信号量是9013进程。然后在进程9013上使用gdbattach,其中一个线程的调用栈如图所示,该线程也在获取锁。同时仔细观察其他线程的锁,也没有等待锁的地方。难道是重入锁了?继续看上面的栈帧,对照代码,发现第12帧已经获得了锁。至此问题已经确定。3、修改及预防措施进程锁在windows下可以在同一个线程重入,在linux下不能重入(可以写一个简单的单线程程序验证)。在Linux下,应该避免同一个线程进程锁的重入。修改方法:减少第一次获取锁时的使用范围,及时释放。
