執行緒鎖 NSRecursiveLock

2021-07-24 09:46:59 字數 1700 閱讀 8258

nsrecursivelock :遞迴鎖,有時候「加鎖**」中存在遞迴呼叫,遞迴開始前加鎖,遞迴呼叫開始後會重複執行此方法以至於反覆執行加鎖**最終造成死鎖,這個時候可以使用遞迴鎖來解決。

使用遞迴鎖可以在乙個執行緒中反覆獲取鎖而不造成死鎖,這個過程中會記錄獲取鎖和釋放鎖的次數,只有最後兩者平衡鎖才被最終釋放。

@inte***ce

nsrecursivelock : nsobject

// 在給定的時間之前去嘗試請求乙個鎖

- (bool)lockbeforedate:(nsdate *)limit

// 嘗試去請求乙個鎖@property (nullable, copy) nsstring *name;

@end

nsrecursivelock實際上定義的是乙個遞迴鎖,這個鎖可以被同一執行緒多次請求,而不會引起死鎖。

主要是用在迴圈或遞迴操作中。我們先來看乙個示例:

nslock *lock = [[nslock alloc] init];

dispatch_async(dispatch_get_global_queue(dispatch_queue_priority_default, 0), ^

[lock unlock];

};recursivemethod(5);

});

這段**是乙個典型的死鎖情況。在我們的執行緒中,recursivemethod是遞迴呼叫的。所以每次進入這個block時,都會去加一次鎖,而從第二次開始,由於鎖已經被使用了且沒有解鎖,所以它需要等待鎖被解除,這樣就導致了死鎖,執行緒被阻塞住了。偵錯程式中會輸出如下資訊:

2016-11-06 15:18:32.865 sss[19932:855235] value = 5

2016-11-06 15:18:34.938 sss[19932:855235] -[nslock lock]: deadlock (0x6100000cc9b0> '(null)')

2016-11-06

15:18:34.938 sss[19932:855235] break on _nslockerror() to debug.

在這種情況下,我們就可以使用nsrecursivelock。它可以允許同一執行緒多次加鎖,而不會造成死鎖。遞迴鎖會跟蹤它被lock的次數。每次成功的lock都必須平衡呼叫unlock操作。只有所有達到這種平衡,鎖最後才能被釋放,以供其它執行緒使用。

所以,對上面的**進行一下改造

nsrecursivelock *lock = [[nsrecursivelock alloc] init];

輸出的結果如下:

2016-11-06

15:21:19.315 sss[19972:857154] value = 5

2016-11-06

15:21:21.389 sss[19972:857154] value = 4

2016-11-06

15:21:23.464 sss[19972:857154] value = 3

2016-11-06

15:21:25.537 sss[19972:857154] value = 2

2016-11-06

15:21:27.612 sss[19972:857154] value = 1

執行緒鎖與避免執行緒鎖 執行緒鎖檢測

程序是資源共享的,執行緒是資源私有的。死鎖的四個必要條件 在計算機專業的本科教材中,通常都會介紹死鎖的四個必要條件。這四個條件缺一不可,或者說只要破壞了其中任何乙個條件,死鎖就不可能發生。我們來複習一下,這四個條件是 互斥 mutual exclusion 存在這樣一種資源,它在某個時刻只能被分配給...

執行緒之 鎖 synchronized鎖

多執行緒中有寫程式是由一寫bug的,學習執行緒鎖,很經典的例子,買票案例 有a,b,c三個視窗,同時售賣100張票,最後可能會出現賣了重複的票,或者多賣了,賣超了等執行緒不安全問題 看乙個執行緒不安全的賣票 小明,小張,小王同時去買票,就會出現上面的執行緒不安全問題,因為,視窗1賣了1張票,而另外兩...

執行緒和鎖,鎖公升級

程式 qq.exe feiqiu.exe 這種靜靜的躺在硬碟的軟體 程序 當程式載入到記憶體進行執行的就是程序資源分配的基本單位 執行緒 是程式執行的基本單位 執行緒如何進行排程的?linux是執行緒排程器,os 作業系統 執行緒切換的概念是什麼?context switch cpu儲存現場執行新執...