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
*/
- 输出task1
- 输出task2前阻塞线程,输出完task2,不再阻塞线程,继续执行
- 输出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