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 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.