1. PTHREAD_MUTEX_ROBUST 在锁持有进程死亡后 next-owner 恢复的工程价值?
PTHREAD_MUTEX_ROBUST 在锁持有进程死亡后 next-owner 恢复的工程价值?
- 机制:futex 的 robust_list——内核在进程退出时遍历 robust list,唤醒挂起者并标记 owner died
- next-owner 恢复:下一个获锁者通过返回 EOWNERDEAD 得知原 owner 死亡,被要求恢复状态
- 工程价值:防止持锁进程崩溃导致死锁,数据库/多进程共享内存场景
普通 pthread mutex 在锁持有者进程崩溃(异常退出、被 kill)时,锁会留在"已锁定"状态,其他等待该锁的进程可能永久阻塞——形成死锁。PTHREAD_MUTEX_ROBUST(robust mutex)通过内核的 robust_list 机制解决:持有锁的进程把其持有的所有 robust mutex 登记到内核的 robust list(用户态维护、内核在进程退出时检查)。当进程死亡时,内核遍历其 robust list,对其中"仍被锁持有"的 mutex 执行"所有权转移":唤醒等待队列中的下一个等待者,并把该 mutex 标记为"owner died"(EOWNERDEAD)。next-owner 恢复:下一个取得锁的线程通过 pthread_mutex_lock 返回 EOWNERDEAD 得知"原 owner 已死亡",并自动获得锁所有权;此时须调用 pthread_mutex_consistent() 声明已恢复共享状态一致后,锁才可正常使用。工程价值:一、防止"持锁进程崩溃→等待者永久阻塞"的进程级死锁;二、适用于共享内存多进程场景(如数据库、消息队列、共享数据结构),一个进程崩溃不拖垮其他进程;三、代价是锁操作轻微变慢(登记 robust list、内核检查)与恢复责任(须调用 consistent 并处理不一致状态)。结论:robust mutex 把"崩溃容忍"(进程死亡所有者转移)交由内核保证,next-owner 恢复是进程健壮性的关键。
先讲普通 mutex 在持锁进程死亡时的死锁问题,再讲 robust_list 内核机制与 EOWNERDEAD/consistent 的 next-owner 恢复协议,最后落到多进程共享内存场景的工程价值与代价。