nginxでは、ngx_time_update関数を複数のスレッドで実行することができますが、1つのスレッドがこの関数を実行すれば、他のスレッドがこの関数を実行する必要はありません。
この要件に関して、nginx が提供する実装計画は非常に興味深いものです。
ngx_time_update の最初の 2 つの文は次のとおりです:
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
#define ngx_atomic_cmp_set(lock, old, set) \ ((ngx_atomic_uint_t) InterlockedCompareExchange((long *) lock, set, old) \ == old)
ngx_atomic_uint_t はタイプのエイリアスです符号なし整数の。
この時点で、この同期ソリューションは InterlockedCompareExchange を使用して実装されていることがわかります。
まず第一に、Interlocked 一連の関数は操作のアトミック性を保証できます。
ngx_time_lock 変数の値が 0 になり、2 つのスレッドが InterlockedCompareExchange 関数を実行する必要があると仮定します。現時点では、1 つのスレッドのみが最初に実行され、ngx_time_lock の値が 1 に変更され、0 が返されます。別のスレッドは、新しい ngx_time_lock 値 (つまり 1) と 0 を比較します。このとき、交換は行われず、元の値 1 が返されるため、このスレッドは if 判定で確実に戻ります。
さらに、ngx_atomic_t の型定義は次のとおりです: typedef volatile unsigned int ngx_atomic_t;
上記では、nginx のマルチスレッド時間更新モデルをその側面も含めて紹介していますが、PHP チュートリアルに興味のある友人に役立つことを願っています。