共享資源的使用是互斥的,即乙個執行緒獲得資源的使用權後就會將改資源加鎖,使用完後會將其解鎖,所以在使用過程中有其它執行緒想要獲取該資源的鎖,那麼它就會被阻塞陷入睡眠狀態,直到該資源被解鎖才會別喚醒,如果被阻塞的資源不止乙個,那麼它們都會被喚醒,但是獲得資源使用權的是第乙個被喚醒的執行緒,其它執行緒又陷入沉睡。
舉個例子:
假如桌子上有乙隻筆(資源有限),現在有多個人想用這乙隻筆(出現資源搶占的情況),就必須排隊等待,正在使用中的人使用完成後,其他人才能使用。
讀寫鎖擁有讀狀態加鎖、寫狀態加鎖、不加鎖三種狀態。只有乙個執行緒可以占有寫狀態的鎖,但可以多個執行緒同時占有讀狀態鎖,這也是它可以實現高併發的原因。當其處於寫狀態鎖下,任何想要嘗試獲得鎖的執行緒都會被阻塞,直到寫狀態鎖被釋放;如果是處於讀狀態鎖下,允許其它執行緒獲得它的讀狀態鎖,但是不允許獲得它的寫狀態鎖,當讀寫鎖感知到有執行緒想要獲得寫狀態鎖時,便會阻塞其後所有想要獲得讀狀態鎖的執行緒。所以讀寫鎖非常適合資源的讀操作遠多於寫操作的情況。
讀寫鎖三個特徵:
1、多個讀者可以同時進行讀
2、寫者必須互斥,只允許乙個寫者寫,也不能讀者寫者同時進行
3、寫者優先於讀者,一旦有寫者,則後續讀者必須等待,喚醒時優先考慮寫者
舉個例子:
加入現在有乙個可以修改的手冊,在沒有人修改的情況下,可以多個人湊過來一起讀,但是有人修改的時候,為了避免其他人讀到正在修改的資料(可能讀到修改前的資料),此時只能改,不能讓其他人讀。同時修改的優先順序要高度讀的優先順序。 如果出現有多人想要同時修改的情況,此時的寫鎖就相當於互斥鎖了。
舉個例子:
還是假如桌上有乙隻筆,你想使用這支筆,而這時筆正在被其他人使用。如果此時你只是眯著眼睛幹等著啥也不做,就相當於互斥鎖。如果你不停的在檢查是否有筆可用,這就是自旋鎖。
the end!
Linux 互斥鎖 遞迴鎖 自旋鎖 讀寫鎖
在多執行緒中,我們經常會要用到鎖,那麼,鎖是什麼,我們為什麼要用到鎖?回到問題的本質,我們在什麼場景下會用到鎖?鎖是針對程式中的臨界資源,也就是公共資源的,當我們有兩個或多個執行緒同時對乙個臨界資源操作的時候,為了保證共享資料操作的完整性,我們要為這些公共資源加鎖。在linux中常見的鎖主要有互斥鎖...
互斥鎖 自旋鎖 讀寫鎖 悲觀鎖 樂觀鎖
最底層的兩種就是會 互斥鎖和自旋鎖 有很多高階的鎖都是基於它們實現的,你可以認為它們是各種鎖的地基,所以我們必須清楚它倆之間的區別和應用。加鎖的目的就是保證共享資源在任意時間裡,只有乙個執行緒訪問,這樣就可以避免多執行緒導致共享資料錯亂的問題。當已經有乙個執行緒加鎖後,其他執行緒加鎖則就會失敗,互斥...
互斥鎖 自旋鎖 讀寫鎖 條件變數
互斥鎖 同一時刻只能有乙個執行緒進入臨界區,乙個執行緒獲取鎖如果失敗,則該執行緒進入睡眠狀態,同一執行緒多次加鎖會造成死鎖。使用場景 1.持鎖時間長 2臨界區競爭非常激烈 3 單核處理器 自旋鎖 不會造成執行緒進入睡眠狀態,執行緒會不斷檢測鎖是否已經釋放,減少了執行緒從睡眠到喚醒的核心開銷。使用場景...