oc不同方式實現鎖2

2022-07-19 10:30:14 字數 1864 閱讀 1149

在上一文中,我們已經討論過用objective-c鎖幾種實現(跳轉位址),也用**實際的演示了如何通過構建乙個互斥鎖來實現多執行緒的資源共享及執行緒安全,今天我們繼續討論鎖的一些高階用法。

1.nsrecursivelock遞迴鎖

平時我們在**中使用鎖的時候,最容易犯的乙個錯誤就是造成死鎖,而容易造成死鎖的一種情形就是在遞迴或迴圈中,如下**:

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

2627

2829

30

//主線程中

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

testobj *obj = [[testobj alloc] init];

//執行緒1

dispatch_async(dispatch_get_global_queue(dispatch_queue_priority_default, 0), ^

[thelock unlock];

};testmethod(5);

});//執行緒2

dispatch_async(dispatch_get_global_queue(dispatch_queue_priority_default, 0), ^);

2.nsconditionlock條件鎖

當我們在使用多執行緒的時候,有時一把只會lock和unlock的鎖未必就能完全滿足我們的使用。因為普通的鎖只能關心鎖與不鎖,而不在乎用什麼鑰匙才能開鎖,而我們在處理資源共享的時候,多數情況是只有滿足一定條件的情況下才能開啟這把鎖:

123

4567

891011

1213

1415

1617

1819

20

//主線程中

nsconditionlock *thelock = [[nsconditionlock alloc] init];

//執行緒1

dispatch_async(dispatch_get_global_queue(dispatch_queue_priority_default, 0), ^

});//執行緒2

dispatch_async(dispatch_get_global_queue(dispatch_queue_priority_default, 0), ^);

3.nsdistributedlock分布式鎖

以上所有的鎖都是在解決多執行緒之間的衝突,但如果遇上多個程序或多個程式之間需要構建互斥的情景該怎麼辦呢?這個時候我們就需要使用到nsdistributedlock了,從它的類名就知道這是乙個分布式的lock,nsdistributedlock的實現是通過檔案系統的,所以使用它才可以有效的實現不同程序之間的互斥,但nsdistributedlock並非繼承於nslock,它沒有lock方法,它只實現了trylock,unlock,breaklock,所以如果需要lock的話,你就必須自己實現乙個trylock的輪詢,下面通過**簡單的演示一下吧:

程式a:

dispatch_async(dispatch_get_global_queue(dispatch_queue_priority_default, 0), ^{

123

4567

程式b:

123

4567

8910

Objective C中不同方式實現鎖(2)

在上一文中,我們已經討論過用objective c鎖幾種實現 跳轉位址 也用 實際的演示了如何通過構建乙個互斥鎖來實現多執行緒的資源共享及執行緒安全,今天我們繼續討論鎖的一些高階用法。1.nsrecursivelock遞迴鎖 平時我們在 中使用鎖的時候,最容易犯的乙個錯誤就是造成死鎖,而容易造成死鎖...

Objective C中不同方式實現鎖 二

在上一文中,我們已經討論過用objective c鎖幾種實現 跳轉位址 也用 實際的演示了如何通過構建乙個互斥鎖來實現多執行緒的資源共享及執行緒安全,今天我們繼續討論鎖的一些高階用法。1.nsrecursivelock遞迴鎖 平時我們在 中使用鎖的時候,最容易犯的乙個錯誤就是造成死鎖,而容易造成死鎖...

不同方式分割平面問題

1 n條直線最多分平面問題 題目大致如 n條直線,最多可以把平面分為多少個區域。析 可能你以前就見過這題目,這充其量是一道初中的思考題。但乙個型別的題目還是從簡單的入手,才容易發現規律。當有n 1條直線時,平面最多被分成了f n 1 個區域。則第n條直線要是切成的區域數最多,就必須與每條直線相交且不...