解决进程间共享内存,由于某个进程异常退出导致死锁问题
这篇讲的是在进程间共享内存编程中,因某个进程异常退出而导致死锁的经典坑。作者从一个线上服务重启后的超时问题出发,层层排查,最终定位到根源:一个读进程在持有读写锁时突然崩溃,导致锁的计数器(`nr_readers`)没有递减,写进程因此永远等不到锁,共享内存数据无法更新,最终引发服务故障。 作者不仅用测试代码复现了这一问题,更深入探讨了如何解决。读写锁在这种场景下缺乏自动恢复机制。一个巧妙的出路是改用互斥锁,并设置其`PTHREAD_MUTEX_ROBUST_NP`属性(Robust锁)。当持锁进程死亡时,锁不会永久阻塞,而是返回`EOWNERDEAD`,后续线程调用`pthread_mutex_consistent_np`即可修复锁状态,使其恢复正常。此外,作者还提醒,通过共享内存交换数据时,务必增加完成标记,以确保数据在进程崩溃时不会处于不完整的中间状态。 文章从实际故障切入,完整呈现了“发现问题-分析根因-测试验证-寻求方案”的解决链条,特别是对Robust锁的应用,为处理跨进程的异常状态恢复提供了非常实用的思路。