GCD(IV)

死锁:2个任务相互等待造成的。

 1 - (void) GCD {
 2     NSLog(@"begin");
 3     dispatch_queue_t queue = dispatch_queue_create("cen.gcd", DISPATCH_QUEUE_SERIAL);
 4     dispatch_async(queue, ^{ //block1 任务1
 5         NSLog(@"-------------》》  1");
 6         dispatch_sync(queue, ^{//block2 任务2
 7             NSLog(@"~~~~~~~~~~~<<<  2");
 8         });
 9         NSLog(@"------------》》》 3");
10     });
11     NSLog(@"end");
12 }

打印结果:

2018-06-18 17:25:32.751666+0800 BlockTest[2110:225630] begin
2018-06-18 17:25:32.751977+0800 BlockTest[2110:225630] end
2018-06-18 17:25:32.752025+0800 BlockTest[2110:225695] -------------》》  1

分析:将NSLog3个打印分别称为:1, 2, 3.

  任务2是一个同步队列,在刚刚开辟的子线程(任务1)中执行。走 2 的时候是在走任务2,因为这是一个同步队列,任务2要走就等任务1走完。任务1里面包括1, 2, 3, 3没有走完,block1没有走完,2不能走。任务2等待任务1走完,任务1等待3走完。任务1等待任务2中的2走完,2等待任务1走完,相互等待形成死锁。

解决办法:①将 DISPATCH_QUEUE_SERIAL 修改为  DISPATCH_QUEUE_CONCURRENT;

     ② 将任务2的同步队列 sync 修改为 asnync。

猜你喜欢

转载自www.cnblogs.com/EchoHG/p/9195651.html
IV
gcd
今日推荐