• 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。

  • 相关阅读:
    对于作用域和闭包的理解
    响应式开发学习(3)——图片优化
    响应式开发(2)
    响应式开发(1)
    数据结构
    进阶题目
    集合
    数组
    内存相关
    线程
  • 原文地址:https://www.cnblogs.com/EchoHG/p/9195651.html
Copyright © 2020-2023  润新知