ngx_shmtx_force_unlock

张开发
2026/5/11 11:19:49 15 分钟阅读
ngx_shmtx_force_unlock
1 定义ngx_shmtx_force_unlock 函数 定义在 ./nginx-1.24.0/src/core/ngx_shmtx.cngx_uint_tngx_shmtx_force_unlock(ngx_shmtx_t*mtx,ngx_pid_tpid){ngx_log_debug0(NGX_LOG_DEBUG_CORE,ngx_cycle-log,0,shmtx forced unlock);if(ngx_atomic_cmp_set(mtx-lock,pid,0)){ngx_shmtx_wakeup(mtx);return1;}return0;}ngx_shmtx_force_unlock 函数的核心作用是 在一个进程异常退出后 由 master 进程强制解除该进程持有的共享内存互斥锁以防止整个系统死锁。2 详解1 函数签名ngx_uint_tngx_shmtx_force_unlock(ngx_shmtx_t*mtx,ngx_pid_tpid)返回值 如果强制解锁成功返回1否则返回0 参数1 ngx_shmtx_t *mtx 指向共享内存互斥锁结构体的指针这是要被强制解锁的目标 参数2 ngx_pid_t pid 待解锁进程的ID用于验证该锁是否确实由该进程持有2 逻辑流程1 调试日志 2 解锁 3 返回失败状态码1 调试日志{ngx_log_debug0(NGX_LOG_DEBUG_CORE,ngx_cycle-log,0,shmtx forced unlock);2 解锁if(ngx_atomic_cmp_set(mtx-lock,pid,0)){ngx_shmtx_wakeup(mtx);return1;}#1 原子比较并交换CAS ngx_atomic_cmp_set(lock, old, new) 是硬件级原子操作 1. 检查 *mtx-lock pid 是否成立 2. 若成立则将 *mtx-lock 原子地设为 0并返回 1 3. 若不成立保持原值不变返回 0。 确保只有锁确实由该 pid 持有时才执行解锁避免误释放其他进程的锁或重复释放。 #2 唤醒等待进程 解锁成功后唤醒因 ngx_shmtx_lock 阻塞的一个或多个等待进程。 确保调度器能及时将等待进程投入运行避免“锁已释放但无人竞争”的性能损失。 向调用者返回 1 表示解锁成功。3 返回失败状态码return0;}如果 CAS 操作失败即锁当前未被目标进程 pid 持有 则不执行任何操作并返回 0 表示解锁失败在 Nginx 的高层模块中 普遍遵循 0 (NGX_OK) 表示成功-1 (NGX_ERROR) 表示失败 的规范。 为什么这里反过来了 在 Nginx 中ngx_atomic_cmp_set 的返回值约定就是 1 表示 CAS 成功旧值匹配且已替换0 表示失败旧值不匹配。 ngx_shmtx_force_unlock 没有进行二次封装映射 而是直接将 CAS 的结果作为自身返回值。

更多文章