首頁  >  文章  >  後端開發  >  nginx中的多執行緒時間更新模型

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

WBOY
WBOY原創
2016-08-08 09:31:181503瀏覽

在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教學有興趣的朋友有幫助。

🎜
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn