nginx中的多线程时间更新模型

来源:互联网 发布:阿里旺旺 mac 老版本 编辑:程序博客网 时间:2024/06/05 18:17

在nginx中,ngx_time_update函数可以被多个线程执行,但只要有一个线程执行了这个函数,其他线程无需执行这个函数。

对于这种需求,nginx给出的实现方案挺有意思。

ngx_time_update开头两句如下:

    if (!ngx_trylock(&ngx_time_lock)) {        return;    }    // do something...    ngx_unlock(&ngx_time_lock);

ngx_trylock和ngx_unlock都是宏定义,代码如下:

#define ngx_trylock(lock)  (*(lock) == 0 && ngx_atomic_cmp_set(lock, 0, 1))#define ngx_unlock(lock)    *(lock) = 0
继续展开ngx_atomic_cmp_set

#define ngx_atomic_cmp_set(lock, old, set)                                    \     ((ngx_atomic_uint_t) InterlockedCompareExchange((long *) lock, set, old) \                          == old)

ngx_atomic_uint_t是unsigned int的类型别名。

至此,可以看出这种同步方案是使用InterlockedCompareExchange实现的。

首先,Interlocked系列函数能够保证操作的原子性。

假设现在ngx_time_lock变量的值为0,有两个线程都要执行InterlockedCompareExchange这个函数了。此时,只会有一个线程先执行,它改变了ngx_time_lock的值为1,并返回0。另外一个线程用新的ngx_time_lock值(也就是1)跟0进行比较,此时,不会发生交换,并且返回原始的值1,保证这个线程在if判断处返回。

另外,ngx_atomic_t的类型定义为:typedef volatile unsigned int ngx_atomic_t;


0 0
原创粉丝点击