초보 nginx 소스 코드 분석 데이터 구조 편 (10) 자전 자물쇠 ngxspinlock
초보 nginx 소스 코드 분석 데이터 구조 편 (10) 자전 자물쇠 ngxspinlock
원자 잠 금 구조 ngxatomic_t:
1: typedef unsigned long ngx_atomic_uint_t; 2: typedef volatile ngx_atomic_uint_t ngx_atomic_t; 원자 잠 금 값 유형 ngxatomic_int_t:
1: typedef long ngx_atomic_int_t; 원자의 비교 와 교환, lock 과 old 가 같 으 면 set 는 lock 에 기록 합 니 다.
1: #define ngx_atomic_cmp_set(lock, old, set) \ 2: __sync_bool_compare_and_swap(lock, old, set) 설명:
bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval, ...) type __sync_val_compare_and_swap (type *ptr, type oldval type newval, ...)
이 두 함 수 는 GCC 가 원자의 비교 와 교환 을 제공 하 는 것 으로 * ptr = = oldval 이면 new val 을 * ptr 에 기록 합 니 다.
프로 세 스 가 주동 적 으로 집행 권 을 양보 합 니 다, ngxsched_yeld
1: #define ngx_sched_yield() sched_yield() 3. 소스 코드 분석
1: void 2: ngx_spinlock(ngx_atomic_t *lock, ngx_atomic_int_t value, ngx_uint_t spin) 3: { 4: 5: #if (NGX_HAVE_ATOMIC_OPS) 6: 7: ngx_uint_t i, n; 8: 9: 10: for ( ;; ) { 11: 12: //*lock == 0, , ngx_atomic_cmp_set , *lock=value, 13: if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, value)) { 14: return; 15: } 16: 17: // 18: if (ngx_ncpu > 1) { 19: 20: // spin 80, 1 ngx_cpu_pause() , 。 2 、4 、8 、16 、32 、64 ngx_cpu_pause() 。 21: // , ,spinlock 。 , ngx_sched_yield, 。 22: for (n = 1; n < spin; n <<= 1) { 23: 24: for (i = 0; i < n; i++) { 25: ngx_cpu_pause(); 26: } 27: 28: // , *lock == 0, 29: if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, value)) { 30: return; 31: } 32: } 33: } 34: 35: // CPU 36: ngx_sched_yield(); 37: } 38: 39: #else 40: 41: #if (NGX_THREADS) 42: 43: #error ngx_spinlock() or ngx_atomic_cmp_set() are not defined ! 44: 45: #endif 46: 47: #endif 48: 49: } 이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JAVA- 소스 코드 분할(Package 사용)▪️test45.java 소스 코드 ▪️test47.java 소스 코드 ▪️실행 결과 더하면 12, 당기면 8 ▪️예① 클래스 이름에 대한 완전한 입력 생략 import 문 사용 ▪️예① test45.java 소스 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.