OC 主线程中调用同步函数造成死锁
2018-03-08 本文已影响34人
十月末的故事
NSLog(@"111");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"sync");
});
NSLog(@"222");
后台输出 111 后,执行到 dispatch_sync 这句代码时会报错 EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP,subcode=0x0)
这是因为
- 主线程是一个串行队列
- 执行 dispatch_sync 同步操作时,将 block 中的任务
NSLog(@"sync");
添加到主线程队列末尾。 -
NSLog(@"sync");
要执行,需要它前面的任务执行完成,而它前面的任务是dispatch_sync
,dispatch_sync
要执行完成又需要 block 中的任务执行完成。 - 由此造成了互相等待,block 中的任务永远不会执行。