GCD(IV)

时间:2023-03-10 03:36:41
GCD(IV)

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

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

打印结果:

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。