nginx中的多執行緒時間更新模型

WBOY
發布: 2016-08-08 09:31:18
原創
1502 人瀏覽過

在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_cmp_set

至此,可以看出這種同步方案是使用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;

以上就介紹了nginx中的多執行緒時間更新模型,包含了方面的內容,希望對PHP教學有興趣的朋友有幫助。

🎜
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板