本章讲述nginx中读写锁的实现。
1. ngx_rwlock.h头文件
这里我们声明了3个函数,分别用于实现nginx的读锁、写锁以及锁释放操作。
2. ngx_rwlock.c源文件
当前我们支持GCC的NGX_HAVE_ATOMIC_OPS
原子操作。
2.1 函数ngx_rwlock_wlock()
此处采用自旋的方式获取一把些锁。因为写锁是独占的,因此获取写锁时*lock
的值必须为0,才能够获取到。下面简要分析一下函数流程:
2.2 函数ngx_rwlock_rlock()
这里用于获取读锁
,与上面获取写锁
类似。但读锁可以共享,因此只要当前锁没有被write lock
独占,就能够获取到。注意到,如果一直获取读锁,可能造成*lock
值达到最大,而变成些锁。但一般不可能会有如此多的线程来同时请求读锁。
2.3 函数ngx_rwlock_unlock()
此函数用于释放锁。从代码我们可以看到,释放读锁时,是将对应的值减1
。
[参看]
- 如何设计一个真正高性能的spin_lock?