GCD的队列,死锁

GCD比thread更底层,而且无需加锁。
队列分为并发,和串行,并发就是可以不用等待结果直接往下运行,而串行则需要一个个按顺序运行。一定要任务全部完成。

 

#import "ViewController.h"


@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    

    //[self concurrentAndAsync];

    //[self concurrentAndSync];

    [self serialAndAsync];

    

    [self mainQueuePrintTask];

}


//主队列中的打印任务

- (void)mainQueuePrintTask {

    

    for (int i = 0; i < 50; i++) {

        NSLog(@"GCD主线程:%i", i);

    }

}


//异步添加任务到并发队列,他是上下两个的位置是随机的,而且理论上for里面的打印也是随机的

- (void)concurrentAndAsync {

    

    //获取全局队列

    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);//全局队列是所有的程序都能用的,是系统自带的队列

    

    //异步添加两个任务到并发队列

    dispatch_async(queue, ^{

        for (int i = 0; i < 20; i++) {

            NSLog(@"异步任务1:%i", i);

        }

    });

    

    dispatch_async(queue, ^{

        for (int i = 0; i < 20; i++) {

            NSLog(@"异步任务2:%i", i);

        }

    });

    

}


//同步添加到并发队列,第一第二两个任务随机,但是里面则是按照小到大

- (void)concurrentAndSync {

    

    //获取全局队列

    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    

    //异步添加两个任务到并发队列

    dispatch_sync(queue, ^{

        for (int i = 0; i < 20; i++) {

            NSLog(@"同步任务1:%i", i);

        }

    });

    

    dispatch_sync(queue, ^{

        for (int i = 0; i < 20; i++) {

            NSLog(@"同步任务2:%i", i);

        }

    });

    

}


//异步添加到串行队列,按顺序先执行第一个任务,再执行第二个。但是里面的打印按原理是随机的

- (void)serialAndAsync {

    

    //创建一个串行队列

    dispatch_queue_t queue = dispatch_queue_create("huiwen", DISPATCH_QUEUE_SERIAL);

    

    //异步添加两个任务到并发队列

    dispatch_async(queue, ^{

        for (int i = 0; i < 20; i++) {

            NSLog(@"异步任务1:%i", i);

        }

    });

    

    dispatch_async(queue, ^{

        for (int i = 0; i < 20; i++) {

            NSLog(@"异步任务2:%i", i);

        }

    });

    

}


//同步添加到串行队列

- (void)serialAndSync {

    

    

}


- (void)createQueueTask {

    

    dispatch_queue_t queue;

    

    //1.创建串行队列

    //queue = dispatch_queue_create("com.wxhl.serial1", NULL);//线程名字,线程类型。默认是串行

    queue = dispatch_queue_create("com.wxhl.serial1", DISPATCH_QUEUE_SERIAL);

    

    //2.创建并发队列

    queue = dispatch_queue_create("com.wxhl.concurrent", DISPATCH_QUEUE_CONCURRENT);

    

    //3.获取iOS系统已创建好的queue

    //全局队列:并发队列,全程序共用

    queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    //获取到主队列:串行队列,是当前程序的主队列

    queue = dispatch_get_main_queue();

    

}

GCD的死锁:GCD的死锁只有在串行的时候才会发生,总的来说就是一个任务放在了串行队列中,然后自身的任务放在block中,是同步的,这时候第一个任务要自身里面的block中的任务完成才会继续进行下去,而block中的任务由于他本身也是串行同步的,他的执行需要前面的任务执行完毕,这时候就产生了死锁。

- (void)deadLock {

    

    //获取主队列

    dispatch_queue_t mainQueue = dispatch_get_main_queue();

    


    //向主队列中同步追加任务,这个async也包含了非堵塞。sync包含了堵塞。,然后这个如果用sync的话就是同步阻塞,然后要等任务完成才会继续执行,这个任务挂起,等Block任务完成,然后返回才会继续执行,但是因为是同步所以block这个任务完成要等前面的任务完成才行。

    dispatch_async(mainQueue, ^{

        

        NSLog(@"block追加任务");

    });

    

    //主队列中打印任务

    for (int i = 0; i < 10; i++) {

        NSLog(@"GCD主线程:%i", i);

    }

    

 

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值