运行应用崩溃,提示pthread_mutex_lock called on a destroyed mutex错误
解决应用崩溃:
pthread_mutex_lock called on a destroyed mutex 核心问题
应用崩溃的直接原因是调用了已被销毁的互斥锁——代码中执行pthread_mutex_destroy销毁某个互斥锁后,后续又触发了pthread_mutex_lock操作,触发未定义行为导致崩溃。
排查方向
- 梳理互斥锁的生命周期:定位所有
pthread_mutex_destroy调用点,检查之后是否存在仍会执行锁操作的代码路径。 - 检查多线程时序:确认是否存在一个线程销毁互斥锁,而另一个线程还在等待/尝试获取该锁的并发场景。
- 借助调试工具:用GDB/LLDB在
pthread_mutex_lock和pthread_mutex_destroy处设断点,追踪调用顺序,定位违规操作的触发逻辑。
修复方案
- 严格控制销毁时机:确保互斥锁的销毁操作在所有使用该锁的线程完全退出、且无后续锁操作可能后执行。
- 增加有效性检查:引入原子状态变量标记互斥锁是否可用,调用
pthread_mutex_lock前先校验状态,跳过无效操作。 - 规范锁操作流程:销毁互斥锁前必须确保已执行
pthread_mutex_unlock,绝对不能在持有锁的状态下销毁。 - 复用锁需重新初始化:如果需要复用互斥锁对象,销毁后必须重新调用
pthread_mutex_init完成初始化,不能直接使用已销毁的锁。
内容的提问来源于stack exchange,提问作者Udemy khan
相关产品推荐
相关产品推荐

