看源碼的時候看到了sync的運用,故將于此有關(guān)的死鎖按自己的想法理解一下
官方的解析
Submits a workitem to a dispatch queue like dispatch_async(), however
dispatch_sync() will not return until the workitem has finished.
將工作項提交到dispatch_async()這樣的調(diào)度隊列赦政, 但是,dispatch_sync()在工作項完成之前不會返回耀怜。
引用一下 這篇文章的說法:
任務(wù)A要想執(zhí)行完,則必須要等待dispatch_sync函數(shù)返回,
然而dispatch_sync要想返回又必須等待任務(wù)B完成,
隊列又是先進先出的,所以任務(wù)B要想執(zhí)行則必須等待任務(wù)A執(zhí)行完成,
這就形成了相互等待,從而發(fā)生死鎖.
有些人可能會想憑啥任務(wù)B就得排在任務(wù)A后面?咋就不能在任務(wù)A前面?
我現(xiàn)在就告訴你還真不能,前面已經(jīng)說了dispatch_sync是不新開線程的,它
現(xiàn)在在當前線程提交一個任務(wù)B,那理所當然的任務(wù)B就得排在任務(wù)A后面.
用代碼去看
// 在主隊列上,插入一個同步block塊,導(dǎo)致死鎖
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"do someting");
});
這里其實看了挺久看不懂的,我們可以這樣去想,主線程是同步單線程的.在同步線程上插入了block塊,相當于如下代碼:
dispatch_queue_t serialQueue = dispatch_queue_create("com.blbl", DISPATCH_QUEUE_SERIAL);
dispatch_sync(serialQueue, ^{
NSLog(@"任務(wù)A");
/**
在當前隊列又提交一次同步運行的block恢着,
導(dǎo)致任務(wù)A需要等待任務(wù)B返回,而任務(wù)A在任務(wù)B之前調(diào)用财破,
所以任務(wù)B又需要等待任務(wù)A返回了之后才能執(zhí)行
*/
dispatch_sync(serialQueue, ^{
NSLog(@"任務(wù)B");
});
});
個人比較通俗的理解方式
- 由于隊列是先進先出的, 所以任務(wù)A先運行,所以任務(wù)A在隊列前方
- 任務(wù)B這時候同步了一個block塊進來然评,然后任務(wù)A就需要去等待任務(wù)B完成
- 由由于任務(wù)A先進來嘛,然后任務(wù)B又要等任務(wù)A完成
- 再通俗一點的說狈究,任務(wù)B 插隊了 任務(wù)A,卻又在等任務(wù)A完成。????