0x00 输出顺序
下面代码的输出顺序是?
NSLog(@"1");
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
NSLog(@"2");
dispatch_sync(queue, ^{
NSLog(@"3");
});
NSLog(@"4");
});
NSLog(@"5");
输出顺序是:1,5,2
结果是:崩溃
0x01 崩溃原因
崩溃指向 dispatch_sync
函数所在行
Thread 8: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
因为 queue
是个 串行队列
,使用 dispatch_sync()
函数往 串行队列
添加任务,会导致 死锁
官方文档对 dispatch_sync
的说明:
Submits a workitem to a dispatch queue like dispatch_async(), however
dispatch_sync() will not return until the workitem has finished.
dispatch_sync()
函数不会立即返回,直到任务完成!
0x02 更进一步
查看崩溃时,相关的汇编代码:
崩溃所指向地方是:调用 dispatch_sync()
函数后的 下一行
所以,通过汇编来看,就很明了了
dispatch_sync()
函数把 block 提交到队列 queue
,让队列 queue
马上执行提交的任务!
但是队列现在在执行 任务4
就像这样:
… | 任务3 | 任务4 |
---|
因为是串行队列
,所以提交的 任务3
,只能放在 任务4
后面
任务4
在前面,但现在必须要执行 任务3
,所以 任务4
无法执行
任务3
要执行,但是前面有个 任务4
没执行完,所以 任务3
也执行不了
你不动,我不动,一动不动是___。😂
所以导致了 死锁
!
然后 GG
了
让笔记一步到位
你只管尽情的复制,剩下的只管卧槽 😃