>  기사  >  백엔드 개발  >  nginx의 멀티스레드 시간 업데이트 모델

nginx의 멀티스레드 시간 업데이트 모델

WBOY
WBOY원래의
2016-08-08 09:31:181510검색

nginx에서는 ngx_time_update 함수가 여러 스레드에 의해 실행될 수 있지만, 하나의 스레드가 이 함수를 실행하는 한 다른 스레드는 이 함수를 실행할 필요가 없습니다.

이러한 요구 사항에 대해 nginx에서 제공하는 구현 계획은 매우 흥미롭습니다.

ngx_time_update의 처음 두 문장은 다음과 같습니다.

    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는 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 휘발성 unsigned int ngx_atomic_t;


위 내용은 nginx의 다중 스레드 시간 업데이트 모델을 소개하며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.