美文网首页
GCD 线程学习笔记(1)

GCD 线程学习笔记(1)

作者: Jin丶hy | 来源:发表于2016-04-22 10:59 被阅读7次

    GCD Queue 分为三种:

    1,The main queue  :主队列,主线程就是在个队列中。

    2,Global queues : 全局并发队列。

    3,用户队列:是用函数 dispatch_queue_create 创建的自定义队列

    下面例子就是之前面试的试题:

    sync 同步队列,dispatch_sync 函数不会立即返回,及阻塞当前线程,等待 block同步执行完成。

    viewDidLoad 在主线程运行,

    dispatch_sync 会把 块里面的内容放到一个线程里面,然后把线程加入到主线程中,

    但是,sync的block(也就是“NSLog(@"=================5");”) 会等待主线程运行完成再调用,

    然而主线程在等sync的block调用完成,

    在互相等待中造成死锁

    async 异步队列,dispatch_async 函数会立即返回, block会在后台异步执行。

    上面例子就不会,

    dispatch_get_global_queue, 在全局并发线程中加入,与主线程并发运行。


    dispatch_sync(dispatch_get_main_queue(), ^{

        NSLog(@"=================2");

    });


    上面这个block会等待主线程完成再执行,所以会阻塞异步的dispatch_get_global_queue一下下,等主线程完成了之后 运行NSLog(@"=================2");后返回,使dispatch_get_global_queue继续完成NSLog(@"=================3");

    上图就是这个原理。

    NSLog(@"=================2");的块会等待主线程完成再执行,所以会阻塞异步的dispatch_get_global_queue。

    主线程一直完成不了,就会一直阻塞。


    打印结果:

    2014-11-30 17:56:22.296 Test[6108:379350] =================1

    2014-11-30 17:56:22.296 Test[6108:379231] ==========阻塞主线程

    永远等着。。。。。

    相关文章

      网友评论

          本文标题:GCD 线程学习笔记(1)

          本文链接:https://www.haomeiwen.com/subject/cbfxrttx.html