nginx內部鎖的實現

2021-09-24 02:26:01 字數 784 閱讀 2729

多程序或者多執行緒的程式,涉及到對共享資源的修改,都需要使用到鎖。最常見的情況(也一般是然並卵的情況)是對乙個全域性變數進行++操作,比如有個全域性變數i,如果多個執行緒同時執行i++,教科書已經提到,是會出問題的。因為i++並不是乙個原子操作,彙編之後會是三個操作:

movl    i(%rip), %eax

addl $1, %eax

movl %eax, i(%rip)

這時候就需要鎖了(當然,這裡的情況,你也可以嵌入彙編的方式使用fetch-and-add的方式來避免使用鎖,不過,在多核情況下,你仍然需要加上lock字首)。nginx 是乙個多程序的服務,並且引入了執行緒池,不可避免也需要用到鎖。

相關的**在src/core/ngx_rwlock.[hc]

相關的**在src/core/ngx_spinlock.c

相關的**在src/core/ngx_shmtx.[hc]。之所以需要這個,是因為nginx中存在多個程序,在某些操作時,比如對監聽的fd執行accept()操作,需要互斥進行。而由於跨了多個程序,只能將用於實現lock的記憶體放在共享記憶體。

看下ngx_spinlock()ngx_shmtx_lock()的**,會發現都使用了ngx_atomic_cmp_set()這個函式。

未完待續。。

nginx內部鎖的實現

多程序或者多執行緒的程式,涉及到對共享資源的修改,都需要使用到鎖。最常見的情況 也一般是然並卵的情況 是對乙個全域性變數進行 操作,比如有個全域性變數i,如果多個執行緒同時執行i 教科書已經提到,是會出問題的。因為i 並不是乙個原子操作,彙編之後會是三個操作 movl i rip eax addl ...

詳解Golang互斥鎖內部實現

go語言提供了一種開箱即用的共享資源的方式,互斥鎖 sync.mutex sync.mutex的零值表示乙個沒有被鎖的,可以直接使用的,乙個goroutine獲得互斥鎖後其他的goroutine只能等到這個gorutine釋放該互斥鎖,在mutex結構中只公開了兩個函式,分別是lock和unl程式設...

vector的內部實現

假定你現在已經能熟練使用vector,如果你很好奇vector背後是怎麼實現的,那麼本文或許對你能有所幫助。vector代表了c 的動態陣列,大小是動態可增長的。你不必考慮自己手動分配或釋放記憶體,也不必擔心記憶體洩漏,vector幫你做了這一切。vector的使用很簡單,但是要做到有效率,沒那麼容...