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)

执行报错

这是因为

  1. 主线程是一个串行队列
  2. 执行 dispatch_sync 同步操作时,将 block 中的任务 NSLog(@"sync"); 添加到主线程队列末尾。
  3. NSLog(@"sync"); 要执行,需要它前面的任务执行完成,而它前面的任务是 dispatch_syncdispatch_sync要执行完成又需要 block 中的任务执行完成。
  4. 由此造成了互相等待,block 中的任务永远不会执行。
上一篇下一篇

猜你喜欢

热点阅读