线程

作者: 砽洧泩 | 来源:发表于2019-01-24 14:26 被阅读0次

    1:- (void)viewDidLoad {

    //dispatch_sync(dispatch_get_main_queue(), ^{

    //NSLog(@3);

    //死锁原因

    //1:dispatch_sync在等待block语句执行完成,而block语句需要在主线程里执行,所以dispatch_sync如果在主线程调用就会造成死锁

    //2:dispatch_sync是同步的,本身就会阻塞当前线程,也即主线程。而又往主线程里塞进去一个block,所以就会发生死锁。

    //});

    //dispatch_async(dispatch_get_global_queue(), ^{

    //async 在主线程中 创建了一个异步线程 加入 全局并发队列,async 不会等待block 执行完成,立即返回

    NSLog(@2);//不会造成死锁;

    });

    }

    分析这段代码:view DidLoad 在主线程中,也即dispatch_get_main_queue()中,执行到sync时向dispatch_get_main_queue()插入同步thread,sync会等到后面的block执行完成才返回。sync又在主队列里面,是个串行队列,sync是后面才加入的,前面一个是主线程,所以sync想执行block必须等待前一个主线程执行完成,而主线程却

    在等待sync返回,去执行后续工作,从而造成死锁。

    2:dispatch_sync 和 dispatch_async 区别:

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

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

    3:GCD Queue 分为三种:

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

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

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

    相关文章

      网友评论

          本文标题:线程

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