thread - iOS GCD队列阻塞问题
天蓬老师
天蓬老师 2017-04-18 09:18:20
[iOS讨论组]

代码1

dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_sync(mainQueue, ^{
    NSLog(@"为啥堵塞");
});

代码2

dispatch_queue_t queue = dispatch_queue_create("abc", DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue, ^{
    NSLog(@"为啥不堵塞");
});

如上,两段代码,都运行在主线程中,mainQueue也是串行队列,为什么代码1会造成线程阻塞,而代码2不会阻塞?或者说代码2不会阻塞大家可能都了解,为什么在主队列调用dispatch_sync就会阻塞?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(5)
大家讲道理

循环等待。你在主线程同步派发一个任务,那主线程就要等这个任务执行完才继续执行。而你又把任务派发在主线程,主线程现在在等待这个完成继续执行,这个任务又在等待主线程空闲来执行。

PHP中文网

第一个是阻塞mainQueue, 然后让mainQueue去把block里面的东西加到mainQueue中去
第二个是阻塞dispatch_queue_create("abc", DISPATCH_QUEUE_SERIAL), 然后让mainQueue把block里面的东西加到dispatch_queue_create("abc", DISPATCH_QUEUE_SERIAL)中去.

PHP中文网

为什么1会阻塞?因为1是主线程,runloop会时时监听和更新UI,你这里给它安排一个同步sync肯定阻塞,应该用异步async。
为什么2不会阻塞?不是不会阻塞,只是不会阻塞主线程,因为你这里新建的一个子线程,如果你在这个子线程里写个while(TRUE),然后再用这个子线程来同步(sync)一个操作,你看看会不会阻塞这个子线程。

怪我咯

看这里

伊谢尔伦
  • 1

    App:主线程,你过来,给你个任务,任务完成后再走
    主线程:什么任务?
    App:你去那边打印机上,打印个东西,但是你不能离开这里,完成后才能走
    主线程:……
    
  • 2

    App:主线程,你过来,给你个任务,任务完成后再走
    主线程:什么任务?
    App:你叫 **abc** 去那边打印机上,打印个东西,但是你不能离开这里,完成后才能走
    主线程:**abc**,快去打印个东西,现在就要!
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号