原子操作
原子操作指的是由多步组成的一个操作.如果该操作原子的执行,则要么执行玩所有步骤,要么一步也不执行,不可能值执行所有步骤的一个子集.
想要使用原子擦操作来修改,获取整型变量,自然不能使用加减号,而要使用nginx提供的两个方法:ngx_atomic_cmp_set和ngx_atomic_fetch_add.
static ngx_inline ngx_atomic_uint_t
ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old,
ngx_atomic_uint_t set)
{
//当原子变量lock与old相等时,才能把set设置到lock中
if (*lock == old) {
*lock = set;
return 1; //成功返回1
}
return 0; //失败返回0
}
static ngx_inline ngx_atomic_int_t
ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add)
{
ngx_atomic_int_t old;
old = *value;
*value += add; //加上add的值
return old; //返回原先value的值
}
自旋锁
(1) 自旋锁时一种非睡眠锁,在获取锁之前,当前进程(线程)不会进入睡眠状态,而是始终保持进程在可执行状态,每当内核调度到这个进程时就持续检查是否可以获取到锁.
(2) 自旋锁主要时为多处理器系统而设