关于死锁

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

示例:一个标准的死锁

- (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 所在线程的关联队列中

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航