- (void)viewDidLoad {
[super viewDidLoad];
[self sync];
}
- (void)sync {
dispatch_queue_t queue = dispatch_get_main_queue();
NSLog(@"Thread--%@", [NSThread currentThread]);
dispatch_sync(queue, ^{
NSLog(@"sync1--%@", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"sync2--%@", [NSThread currentThread]);
dispatch_sync(queue, ^{
});
dispatch_sync(queue, ^{
NSLog(@"sync3--%@", [NSThread currentThread]);
});
}
- 以上代碼會造成死鎖,原因是viewDidLoad函數(shù)會在主線程執(zhí)行,當(dāng)主線程中有任務(wù)在執(zhí)行時,主隊列內(nèi)的任務(wù)會被阻塞。當(dāng)代碼執(zhí)行到dispatch_sync時,會將block內(nèi)的代碼放入主隊列。因為主隊列被viewDidload阻塞了,所以block不會被執(zhí)行。而dispatch_sync是同步函數(shù),需要block執(zhí)行完畢后才會返回,所以viewDidload和block相互阻塞,形成死鎖。
- 如果將同步函數(shù)隊列換成其他的其他隊列,無論是串行隊列還是并行隊列都不會造成死鎖。因為viewDidload被block阻塞時,block和viewDidload不在同一隊列,block不會被viewDidload阻塞,當(dāng)block自行完畢后viewDidload也會繼續(xù)執(zhí)行。
- 所以GCD的死鎖和線程無關(guān),是因為隊列的阻塞造成了任務(wù)的相互阻塞才形成死鎖。如果兩個任務(wù)不在同一隊列內(nèi)就不會造成死鎖。
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。