菜鸟nginx源码剖析数据结构篇(十) 自旋锁ngx_spinlocknginx
Author:Echo Chen(陈斌)数据结构
Email:chenb19870707@gmail.comapp
Blog:Blog.csdn.net/chen19870707函数
Date:Nov 11th, 2014ui
自旋锁(Spinlock)是一种 Linux 内核中普遍运用的底层同步机制。自旋锁是一种工做于多处理器环境的特殊的锁,在单处理环境中自旋锁的操做被替换为空操做。当某个处理器上的内核执行线程申请自旋锁时,若是锁可用,则得到锁,而后执行临界区操做,最后释放锁;若是锁已被占用,线程并不会转入睡眠状态,而是忙等待该锁,一旦锁被释放,则第一个感知此信息的线程将得到锁。atom
源文件:http://trac.nginx.org/nginx/browser/nginx/src/core/ngx_spinlock.cspa
原子锁结构 ngx_atomic_t:.net
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写入lockcode
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
1: #define ngx_sched_yield() sched_yield()
1: void
2: ngx_spinlock(ngx_atomic_t *lock, ngx_atomic_int_t value, ngx_uint_t spin)
3: {
4:
5: #if (NGX_HAVE_ATOMIC_OPS)
6:
7: ngx_uint_t i, n;
8:
9:
10: for ( ;; ) {
11:
12: //*lock == 0,没有上锁则上锁,则调用ngx_atomic_cmp_set上锁,设置*lock=value,而后返回
13: if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, value)) {
14: return;
15: }
16:
17: // 多核
18: if (ngx_ncpu > 1) {
19:
20: //若是 spin 为 80,则第一次等待 1 个 ngx_cpu_pause() 操做,而后再次查看锁是否可用。接下来每轮分别等待 2个、4 个、8 个、16 个、32 个、64 个 ngx_cpu_pause() 操做后再试。
21: //这中间过程当中若是出现锁被释放从而能够使用的状况,则循环会被停止,spinlock 函数会返回值。若是重试仍没有成功,则执行 ngx_sched_yield,而后再重复上面的操做。
22: for (n = 1; n < spin; n <<= 1) {
23:
24: for (i = 0; i < n; i++) {
25: ngx_cpu_pause();
26: }
27:
28: //检查是否上锁,若是 *lock == 0,则迅速上锁返回
29: if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, value)) {
30: return;
31: }
32: }
33: }
34:
35: //让出CPU执行权
36: ngx_sched_yield();
37: }
38:
39: #else
40:
41: #if (NGX_THREADS)
42:
43: #error ngx_spinlock() or ngx_atomic_cmp_set() are not defined !
44:
45: #endif
46:
47: #endif
48:
49: }
1.http://blog.csdn.net/poechant/article/details/8062969
2.《深刻理解Nginx》