GCD-Sync

Sync: n. 同步

本篇来讲一下Sync,同步.

第一篇提到过,同步异步是指任务是否可以同时执行.但是有个点没有提到,就是:
在使用dispatch_async(queue, ^(void)block)的时候,当代码运行到这一行后,不会等待block执行完毕,继续执行下一行代码,
在使用dispatch_sync(queue, ^(void)block)的时候,代码会等待block执行完毕后,再继续执行.
这也是同步和异步的一个不同点吧!
ok,我们接下来继续上代码:

- (void)testSync
{
    NSLog(@"tet Sync"); //task 1
    //创建一个串行队列
    dispatch_queue_t queue = dispatch_queue_create("com.example.gcd.MySerialDispatchQueue", NULL);

       dispatch_sync(queue, ^{
           NSLog(@"Hello"); // task 2
       });

    NSLog(@"dispatch_sync finished"); //task3
}

/*
输出结果:
2016-12-30 13:55:31.731 GCD-Sync[40292:1985280] tet Sync
2016-12-30 13:55:31.732 GCD-Sync[40292:1985280] Hello
2016-12-30 13:55:31.732 GCD-Sync[40292:1985280] dispatch_sync finished
*/
  1. 输出task1
  2. 输出task2前阻塞线程,输出完task2,不再阻塞线程,继续执行
  3. 输出task3.

然后我们看下一段代码.

- (void)testSync
{
    NSLog(@"tet Sync");
    //创建一个串行队列
    dispatch_queue_t queue = dispatch_queue_create("com.example.gcd.MySerialDispatchQueue", NULL);
    //在串行队列中加入了一个异步任务
    dispatch_sync(queue, ^{ //line 36 block1
        NSLog(@"1");
        //在串行队列中加入了一个同步任务.
       dispatch_sync(queue, ^{ //line 39 block2
           NSLog(@"Hello"); //40
       });
        NSLog(@"2"); // 42
    });
    NSLog(@"dispatch_sync finished");
}
/*
    输出结果:
    2016-12-30 14:03:41.075 GCD-Sync[40337:1988770] tet Sync
    2016-12-30 14:03:41.075 GCD-Sync[40337:1988770] 1
*/

嗯..只会输出这两个,然后程序崩溃了.这是因为触发了死锁(deadlock)
为什么单单的一个同步串行的队列不会造成死锁,而在串行队列里面,再添加一个同步任务就会造成死锁?
其实不光实在同步串行队列里面,异步串行队列里面添加同步任务也会造成死锁.
因为queue中目前有两个任务,一个是36行这里的block1,一个就是追加到queue中的block2.block2想要执行,那么必须等42行的log语句执行完,而42行的log语句执行必须等40行的log语句执行完,因为40行是同步,会阻塞线程,那么就是40等42,42等40,于是就崩溃了…这就是死锁了.

嗯..就酱.
联系方式: q: 958246321

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值