码迷,mamicode.com
首页 > 其他好文 > 详细

关于死锁

时间:2015-07-28 18:20:41      阅读:89      评论:0      收藏:0      [点我收藏+]

标签:

示例:一个标准的死锁

- (void)viewDidLoad
{
[super viewDidLoad];

dispatch_sync(dispatch_get_main_queue(), ^{});

}

dispatch_sync(queue, block) 做了两件事情

  • 将 block 添加到 queue 队列;
  • 阻塞调用线程,等待 block() 执行结束,回到调用线程。

dispatch_async(queue, block) 也做了两件事情:

  • 将 block 添加到 queue 队列;
  • 直接回到调用线程(不阻塞调用线程)。

这里也能看到同步派发和异步派发的区别,就是看是否阻塞调用线程。

 

我们忽略了主线程是先进先出的即(FIFO),而viewdidload这样的方法是属于主线程的,所以主线程应该先执行完viewdidload的任务,然后才执行下一个,可是同步的执行加入主线程话就需要viewdidload 先执行完成,viewdidload却在等待同步的完成所以死锁了

 

所以记住这个教训:不要将 block 同步派发到调用 GCD 所在线程的关联队列中

关于死锁

标签:

原文地址:http://www.cnblogs.com/louyizhidu/p/4683295.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!