你的位置:首页 > 软件开发 > 操作系统 > 关于GCD的探知及个人见解(希望牛人们不吝赐教,以解我惑!)

关于GCD的探知及个人见解(希望牛人们不吝赐教,以解我惑!)

发布时间:2016-01-15 20:00:11
对于GCD中的同步任务、异步任务的区别,之前有前辈们有这么认为的:同步任务:不会开辟线程;异步任务:会开辟新的线程,开辟线程的个数,视资源需求。后来部分人更新了微博简书称:同步任务、异步任务的区别在于前者会阻塞主线程,活着不回阻塞主线程。一开始我也这么认为,但是后来我写Demo的 ...

对于GCD中的同步任务、异步任务的区别,之前有前辈们有这么认为的:

  1. 同步任务:不会开辟线程
  2. 异步任务:会开辟新的线程,开辟线程的个数,视资源需求。

后来部分人更新了微博简书称:同步任务、异步任务的区别在于前者会阻塞主线程,活着不回阻塞主线程。一开始我也这么认为,但是后来我写Demo的时候我就糊涂,不知道是我理解错了,还是怎么滴,就是解释不通。下面是练习代码:

- (void)testOne {    NSLog(@"testOne_start - %@",[NSThread currentThread]);    dispatch_queue_t queue = dispatch_queue_create("serial", DISPATCH_QUEUE_SERIAL);    dispatch_sync(queue, ^{        NSLog(@"testOne_sync - %@",[NSThread currentThread]);  });    NSLog(@"testOne_end - %@",[NSThread currentThread]);}
2.继而执行同步任务,同步任务创建了一个任务,并扔进了serial串行队列中;因为同步任务必须执行完block才返回,故此时主队列认为 同步任务 尚未完成,因此第三个 NSLog任务无法出列,继续执行block(从serial出列) ,执行完block同步任务返回。3.第三个NSLog任务出列。

 

  • 1.主队列出列 第一个NSLog任务执行完毕。2.主队列出列 第二个任务 同步任务, 同步任务创建一个block任务 并添加到主队列中,以等待出列 执行block,但同步任务 必须等待block执行完毕才能返回,但是对于串行队列(主队列)来说只有上一个任务完成了,下一个任务才能出列,所以block任务无法出列 执行,同步任务又等带block出列执行,死锁。

     上面便是我的理解,也是我自己能对上面两份代码作出的唯一解释,但毕竟跟前人说的相反(在查阅资料的时候也发现有人认为是阻塞队列,不过被人反驳了),还是希望大神为我指点,以解我心中之疑惑。


原标题:关于GCD的探知及个人见解(希望牛人们不吝赐教,以解我惑!)

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录