本章我们讲述一下nginx中进程之间互斥锁的实现。
1. 使用原子锁来实现NGINX互斥锁
当前我们支持GCC的NGX_HAVE_ATOMIC_OPS
原子操作,因此我们是通过原子锁的方式来实现NGINX互斥锁的。
1.1 函数ngx_shmtx_create()
本函数用于初始化互斥锁结构。一般要求addr
是处于共享内存中的变量,否则不能实现进程间互斥锁
。
这里注意到如果mtx->spin
的值为-1,那么表示直接采用自旋的方式来获取锁,这时就不会采用Linux信号量
来作为辅助。
1.2 函数ngx_shmtx_destroy()
这里主要是当采用了Linux信号量
作为辅助时,需要调用sem_destroy()来释放相应的信号量资源。
1.3 函数ngx_shmtx_trylock()
本函数用于尝试获取互斥锁
1.4 函数ngx_shmtx_lock()
]
本函数用于获取进程间的互斥锁
。下面我们简要分析一下本函数的实现:
1.5 函数ngx_shmtx_unlock()
此函数用于释放互斥锁
。这里我们注意到,还会调用ngx_shmtx_wakeup()来唤醒正在等待信号量的进程。
1.6 函数ngx_shmtx_force_unlock()
强制解锁。这里需要指定参数pid
.
1.7 函数
这里针对采用Posix信号量
时,需要调用sem_post()来释放信号量。
2. 使用文件锁来实现NGINX互斥锁
如下是采用文件锁的方式来实现NGINX互斥锁。默认是不会执行到如下代码的。
2.1 函数ngx_shmtx_create()
这里通过简单的打开一个文件的方式来创建互斥锁。
2.2 函数ngx_shmtx_destroy()
销毁互斥锁,只需要关闭对应的文件句柄即可。
2.3 函数ngx_shmtx_trylock()
使用F_SETLK
,尝试获取文件锁。
2.4 函数ngx_shmtx_lock()
使用F_SETLKW
,用于获取文件锁。
2.5 函数ngx_shmtx_unlock()
用于释放文件锁。
2.6 函数ngx_shmtx_force_unlock()
当前不支持。
[参看]
-
nginx源码分析1———进程间的通信机制一(信号量)
-
Nginx的锁的实现以及惊群的避免
-
Nginx源代码分析之锁的实现(十八)
-
Nginx—进程锁的实现
-
linux进程锁
-
进程间同步(进程间互斥锁、文件锁)
-
nginx之共享内存