초보 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에 따라 라이센스가 부여됩니다.