nginx のマルチスレッド時間更新モデル

WBOY
リリース: 2016-08-08 09:31:18
オリジナル
1502 人が閲覧しました

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
ログイン後にコピー
は 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 はタイプのエイリアスです符号なし整数の。

この時点で、この同期ソリューションは 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 チュートリアルに興味のある友人に役立つことを願っています。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート