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。