Heim  >  Artikel  >  Backend-Entwicklung  >  Multithread-Zeitaktualisierungsmodell in Nginx

Multithread-Zeitaktualisierungsmodell in Nginx

WBOY
WBOYOriginal
2016-08-08 09:31:181503Durchsuche

In Nginx kann die Funktion ngx_time_update von mehreren Threads ausgeführt werden. Solange jedoch ein Thread diese Funktion ausführt, müssen andere Threads diese Funktion nicht ausführen.

Für diese Anforderung ist der von nginx bereitgestellte Implementierungsplan sehr interessant.

Die ersten beiden Sätze von ngx_time_update lauten wie folgt:

    if (!ngx_trylock(&ngx_time_lock)) {
        return;
    }
    // do something...
    ngx_unlock(&ngx_time_lock);

ngx_trylock und ngx_unlock sind beide Makrodefinitionen und der Code lautet wie folgt:

#define ngx_trylock(lock)  (*(lock) == 0 && ngx_atomic_cmp_set(lock, 0, 1))
#define ngx_unlock(lock)    *(lock) = 0
Weiter um ngx_atomic_cmp_set zu erweitern

#define ngx_atomic_cmp_set(lock, old, set)                                    \
     ((ngx_atomic_uint_t) InterlockedCompareExchange((long *) lock, set, old) \
                          == old)

ngx_atomic_uint_t ist der Typalias von unsigned int.

An diesem Punkt ist ersichtlich, dass diese Synchronisierungslösung mithilfe von InterlockedCompareExchange implementiert wird.

Zuallererst kann die Interlocked-Funktionsreihe die Atomizität von Operationen sicherstellen.

Angenommen, der Wert der Variablen ngx_time_lock ist jetzt 0 und zwei Threads müssen die Funktion InterlockedCompareExchange ausführen. Zu diesem Zeitpunkt wird zuerst nur ein Thread ausgeführt, wodurch der Wert von ngx_time_lock auf 1 geändert und 0 zurückgegeben wird. Ein anderer Thread vergleicht den neuen ngx_time_lock-Wert (dh 1) mit 0. Zu diesem Zeitpunkt findet kein Austausch statt und der ursprüngliche Wert 1 wird zurückgegeben, um sicherzustellen, dass dieser Thread bei der if-Beurteilung zurückkehrt.

Darüber hinaus lautet die Typdefinition von ngx_atomic_t: typedef volatile unsigned int ngx_atomic_t;


Das Obige stellt das Multithread-Zeitaktualisierungsmodell in Nginx vor, einschließlich verschiedener Aspekte. Ich hoffe, es wird für Freunde hilfreich sein, die sich für PHP-Tutorials interessieren.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn