GCD中的串行/并行和同步/异步理解

参考: 感谢小笨狼的《漫谈GCD》

参考文章

队列

  • 串行队列
  • 并行队列

先说队列

串行队列和并行队列,其实都是按照顺序开始执行的。请看下图


GCD中的串行/并行和同步/异步理解_第1张图片
图1

GCD中的串行/并行和同步/异步理解_第2张图片
图2

队列中添加任务的方式 —— 同步与异步

说明一:

  • 之前一直误解同步和异步的概念。其实同步和异步,指的都是,对一个已创建的队列,把任务(可以认为是block)添加进去的方式。
  • 因为GCD的机制,不论是串行/并行队列,都是FIFO的概念,而且管理而言都是GCD内部自行控制,所以其实可以跳开线程这一层,直接来关注队列。

说明二:

  • 在关注串行/并行+同步/异步之前有必要说一下主队列。
    我们整个程序的执行,包括UI更新,可以看做是主队列。比如我们的ViewDidLoad中执行的语句,一步步顺序执行,这就是主队列中的操作。
  • 所谓任务,你可以看做是单独一句代码,也可以看做是一个block

串行添加任务 —— 同步/异步添加任务到串行队列中

  • 代码:
  • 异步添加队列
NSLog(@"1.in main queue");
dispatch_queue_t globalQueue = dispatch_queue_create("serialQ", DISPATCH_QUEUE_SERIAL);
dispatch_async(globalQueue, ^{
    // task
    NSLog(@"2.execute task");
});
NSLog(@"3.in main queue, completed");
GCD中的串行/并行和同步/异步理解_第3张图片
异步添加任务到串行队列

执行结果为:

1.in main queue
3.in main queue, completed
2.execute task

  • 同步添加队列 —— 把上面的代码改成
dispatch_sync(globalQueue, ^{
    // task
    NSLog(@"2.execute task");
});
GCD中的串行/并行和同步/异步理解_第4张图片
异步添加任务到串行队列

执行结果为:

1.in main queue
2.execute task
3.in main queue, completed

并行添加任务 —— 同步/异步添加任务到串行队列中

  • 代码:
  • 同步和异步可以一起说添加队列
NSLog(@"1.main queue");
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(globalQueue, ^{
    NSLog(@"2.task");
  });
NSLog(@"3.main queue");
  • 异步& 同步:


    GCD中的串行/并行和同步/异步理解_第5张图片
    异步.png

    GCD中的串行/并行和同步/异步理解_第6张图片
    同步.png

死锁和队列分类

死锁的发生

GCD中的串行/并行和同步/异步理解_第7张图片
死锁的发生

获取系统提供的串行/并行队列

  • 获取主队列 : —— 串行队列
dispatch_queue_t globalQueue = dispatch_get_main_queue();
  • 获取全局队列队列:—— 并行队列
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

你可能感兴趣的:(GCD中的串行/并行和同步/异步理解)