互斥鎖 遞迴鎖 讀寫鎖和自旋鎖區別

2021-10-06 22:48:50 字數 900 閱讀 8053

共享資源的使用是互斥的,即乙個執行緒獲得資源的使用權後就會將改資源加鎖,使用完後會將其解鎖,所以在使用過程中有其它執行緒想要獲取該資源的鎖,那麼它就會被阻塞陷入睡眠狀態,直到該資源被解鎖才會別喚醒,如果被阻塞的資源不止乙個,那麼它們都會被喚醒,但是獲得資源使用權的是第乙個被喚醒的執行緒,其它執行緒又陷入沉睡。

同乙個執行緒可以多次獲得該資源鎖,別的執行緒必須等待該執行緒釋放所有次數的鎖才能獲得。

讀寫鎖擁有讀狀態加鎖、寫狀態加鎖、不加鎖三種狀態。只有乙個執行緒可以占有寫狀態的鎖,但可以多個執行緒同時占有讀狀態鎖,這也是它可以實現高併發的原因。當其處於寫狀態鎖下,任何想要嘗試獲得鎖的執行緒都會被阻塞,直到寫狀態鎖被釋放;如果是處於讀狀態鎖下,允許其它執行緒獲得它的讀狀態鎖,但是不允許獲得它的寫狀態鎖,當讀寫鎖感知到有執行緒想要獲得寫狀態鎖時,便會阻塞其後所有想要獲得讀狀態鎖的執行緒。所以讀寫鎖非常適合資源的讀操作遠多於寫操作的情況。

讀寫鎖三個特徵

自旋鎖的目的

自旋鎖的實現是為了保護一段短小的臨界區操作**,保證這個臨界區的操作是原子的,從而避免併發的競爭冒險。在linux核心中,自旋鎖通常用於包含核心資料結構的操作,你可以看到許多核心資料結構中都嵌入有spinlock,這些大部分就是用於保護它自身被操作的原子性,在操作這樣的結構體時都經歷這樣的過程:上鎖-操作-解鎖

如果核心控制路徑發現自旋鎖「開著」(可以獲取),就獲取並繼續自己的執行。相反,如果核心控制路徑發現鎖由執行在另乙個cpu上的核心控制路徑「鎖著」,就在原地「旋轉」,反覆執行一條緊湊的迴圈檢測指令,直到鎖被被釋放。自旋鎖是迴圈檢測「忙等」,即等待時核心無事可做,程序在cpu上保持執行,所以它的臨界區必須小,且操作過程必須短。不過,自旋鎖通常非常方便,因為很多核心資源只鎖1毫秒的時間片段,所以等待自旋鎖的釋放不會消耗太多cpu的時間。

Linux 互斥鎖 遞迴鎖 自旋鎖 讀寫鎖

在多執行緒中,我們經常會要用到鎖,那麼,鎖是什麼,我們為什麼要用到鎖?回到問題的本質,我們在什麼場景下會用到鎖?鎖是針對程式中的臨界資源,也就是公共資源的,當我們有兩個或多個執行緒同時對乙個臨界資源操作的時候,為了保證共享資料操作的完整性,我們要為這些公共資源加鎖。在linux中常見的鎖主要有互斥鎖...

互斥鎖 讀寫鎖和自旋鎖的區別

讀寫鎖特點 讀寫鎖有三種狀態 讀加鎖狀態 寫加鎖狀態和不加鎖狀態 只有乙個執行緒可以占有寫狀態的鎖,但可以有多個執行緒同時占有讀狀態鎖,這也是它可以實現高併發的原因。當其處於寫狀態鎖下,任何想要嘗試獲得鎖的執行緒都會被阻塞,直到寫狀態鎖被釋放 如果是處於讀狀態鎖下,允許其它執行緒獲得它的讀狀態鎖,但...

網路程式設計 自旋鎖 互斥鎖 讀寫鎖 遞迴鎖

自旋鎖 互斥鎖 讀寫鎖 遞迴鎖 自旋鎖 互斥鎖 1.自旋鎖不會睡眠,互斥鎖會睡眠,因此自旋鎖效率高於互斥鎖。自旋鎖比較適用於鎖使用者保持鎖時間比較短的情況 2.自旋鎖消耗cpu 由於一直查詢,所以自旋鎖一直占用cpu,互斥鎖不會,自旋鎖導致cpu使用效率低 3.自旋鎖容易造成死鎖 比如遞迴呼叫 遞迴...