菜鸟nginx源码剖析数据结构篇(十) 自旋锁ngx_spinlock
-
Author:Echo Chen(陈斌)
-
Email:[email protected]
-
Date:Nov 11th, 2014
自旋锁(Spinlock)是一种 Linux 内核中广泛运用的底层同步机制。自旋锁是一种工作于多处理器环境的特殊的锁,在单处理环境中自旋锁的操作被替换为空操作。当某个处理器上的内核执行线程申请自旋锁时,如果锁可用,则获得锁,然后执行临界区操作,最后释放锁;如果锁已被占用,线程并不会转入睡眠状态,而是忙等待该锁,一旦锁被释放,则第一个感知此信息的线程将获得锁。
1.源代码位置
源文件:http://trac.nginx.org/nginx/browser/nginx/src/core/ngx_spinlock.c
2.相关结构定义
原子锁结构 ngx_atomic_t:
1: typedef unsigned long ngx_atomic_uint_t;
2: typedef volatile ngx_atomic_uint_t ngx_atomic_t;
原子锁值类型 ngx_atomic_int_t:
1: typedef long ngx_atomic_int_t;
原子的比较和交换,如果lock和old相等,则set写入lock
1: #define ngx_atomic_cmp_set(lock, old, set) \
2: __sync_bool_compare_and_swap(lock, old, set)
说明:
bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval, ...)
type __sync_val_compare_and_swap (type *ptr, type oldval type newval, ...)这两个函数是GCC提供原子的比较和交换,如果*ptr == oldval,就将newval写入*ptr。
进程主动让出执行权,ngx_sched_yeld