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

2021-06-28 04:55:15 字數 1070 閱讀 6334

在nginx中,ngx_time_update函式可以被多個執行緒執行,但只要有乙個執行緒執行了這個函式,其他執行緒無需執行這個函式。

對於這種需求,nginx給出的實現方案挺有意思。

ngx_time_update開頭兩句如下:

if (!ngx_trylock(&ngx_time_lock)) 

// 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;

多執行緒UI更新時間小程式 Python Qt

多執行緒更新ui資料 在兩個執行緒中傳遞資料 signal 和 slot 進行連線 pyqtsignal 通過emit 方法觸發訊號 pyqtsignal通過connect 方法與目標function進行連線 多執行緒更新ui資料 在兩個執行緒中傳遞資料 from pyqt5.qtcore impo...

多執行緒中更新控制項顯示內容

在.net中不能直接在ui control的建立執行緒之外修改ui control的屬性和內容。乙個基本辦法是通過呼叫uicontrol 的invoke方法。考慮乙個簡單的例子 我們希望在乙個通過btnstart啟動的執行緒a中,每隔10秒把txttime的text屬性更新為 執行緒a的執行緒名 執...

python中的多執行緒是假的多執行緒

python中的多執行緒是假的多執行緒?為什麼這麼說,我們先明確乙個概念,全域性直譯器鎖 gil global interpreter lock python 的執行由python虛擬機器 直譯器 來控制,同時只有乙個執行緒在執行 對python虛擬機器的訪問由全域性直譯器鎖 gil 來控制,正是這...