iOS中的執行緒死鎖
執行緒死鎖產生的原因: 在一個序列佇列的任務中,再向這個佇列新增同步任務。
典型例子:

image.png
我們分析一下:

image.png
主佇列main_queue是一個序列佇列,序列佇列的特點就是佇列中所有任務必須順序執行。也就是說必須按照新增到佇列中的先後順序執行。
我們再看一張圖:

image.png
dispatch_sync()
函式給主佇列添加了一個同步任務:
- (void)viewDidLoad { [super viewDidLoad]; dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"執行緒死鎖"); }); }
也就是說後新增的同步任務5是在 viewDidLoad
任務2之後,只有等待任務2執行完之後才能執行任務5,這就是序列佇列的特點。但是任務5是一個同步任務,必須等任務5執行完才能執行其它任務,因此造成互相等待的死鎖。
再看一個例子

image.png
我們知道GCD分為同步任務和非同步任務,最開始的例子是主執行緒的主佇列,相當於是一個同步任務。而這個例子證明了,即便是在非同步任務只要任務佇列是序列佇列,在序列佇列的任務中再向佇列新增同步任務,就會造成死鎖,關鍵點不是同步還是非同步,而是序列佇列。
總結
dispatch_sync()
函式會阻塞執行緒。當前佇列是序列佇列,任務必須順序執行。在序列佇列的任務A中給這個佇列新增同步任務B,相當於說這個序列佇列又多了一個任務B,任務B如果想要執行必須等待任務A執行完,但是任務B是同步任務,必須等任務B執行完才能執行其它任務,所以任務AB互相等待,造成死鎖。