Objective C中不同方式實現鎖 二

2021-06-21 06:26:44 字數 3459 閱讀 9419

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

1.nsrecursivelock遞迴鎖

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

//主線程中

nslock*thelock = [[nslockalloc] 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的鎖未必就能完全滿足我們的使用。因為普通的鎖只能關心鎖與不鎖,而不在乎用什麼鑰匙才能開鎖,而我們在處理資源共享的時候,多數情況是只有滿足一定條件的情況下才能開啟這把鎖:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

//主線程中

nsconditionlock*thelock = [[nsconditionlockalloc] 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:

1

2

3

4

5

6

7

8

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

程式b:

1

2

3

4

5

6

7

8

9

10

dispatch_async(dispatch_get_global_queue(dispatch_queue_priority_default, 0), ^

[lock unlock];

nslog();

});

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

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

不同方式分割平面問題

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

Numpy中的不同方式的切片索引

陣列的切片 布林索引 ps 在這裡我將離散地選取單個或多個元素的操作歸納在索引的內容裡面,而將連續的選取一系列元素放在切面的內容裡 numpy中的基本索引與python類似,對於一維或多維陣列,可以直接基於0 n的下標進行索引。import numpy as np 一維陣列的索引 arr np.ar...