同步串行导致的死锁问题

GCD中同步操作dispatch_sync()中队列使用主队列会导致线程死锁,是众所周知的事情。但是是如何造成死锁的呢?如下面的主队列同步操作,运行结果是崩溃的。


同步串行导致的死锁问题_第1张图片
主队列同步操作

主要原因是在Sync方法中的代码是在dispatch_get_main_queue()主队列中执行的,当执行到dispatch_sync()时就会把任务插入到dispatch_get_main_queue()队列后面中(FIFO原则)。sync 会等到 后面block 执行完成才返回, 而sync 现在又在 dispatch_get_main_queue() 队列中,它 是后加入的主队列的。所以 sync 想执行 block 必须等待主线程执行完成,主线程等待 sync 返回,去执行后续内容。从而造成死锁。也就是相互等待。如下图


同步串行导致的死锁问题_第2张图片
死锁原因

ps: 主队列是GCD本身自带了一种特殊的串行队列,所有放在主队列中的任务都会在主线程上执行

你可能感兴趣的:(同步串行导致的死锁问题)