ホームページ  >  記事  >  バックエンド開発  >  nginx のマルチスレッド時間更新モデル

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

WBOY
WBOYオリジナル
2016-08-08 09:31:181511ブラウズ

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 チュートリアルに興味のある友人に役立つことを願っています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。