GCD 术语 串行 vs. 并发 同步 vs. 异步

Serial vs. Concurrent 串行 vs. 并发

这些术语描述当任务相对于其它任务被执行,任务串行执行就是每次只有一个任务被执行,任务并发执行就是在同一时间可以有多个任务被执行。

Synchronous vs. Asynchronous 同步 vs. 异步
在 GCD 中,这些术语描述当一个函数相对于另一个任务完成,此任务是该函数要求 GCD 执行的。一个同步函数只在完成了它预定的任务后才返回。
 
一个异步函数,刚好相反,会立即返回,预定的任务会完成但不会等它完成。因此,一个异步函数不会阻塞当前线程去执行下一个函数。
 
注意——当你读到同步函数“阻塞(Block)”当前线程,或函数是一个“阻塞”函数或阻塞操作时,不要被搞糊涂了!动词“阻塞”描述了函数如何影响它所在的线程而与名词“代码块(Block)”没有关系。代码块描述了用 Objective-C 编写的一个匿名函数,它能定义一个任务并被提交到 GCD 。
代码如下:

- (void)viewDidLoad

{

    [superviewDidLoad];

    NSLog(@"thread = %@  ", [NSThreadcurrentThread]);

    dispatch_queue_t q =dispatch_queue_create("com.wzh.test",NULL);

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

        dispatch_async(q, ^{

            NSLog(@"block%d add queue %@", i, [NSThreadcurrentThread]);

        });

    }

    NSLog(@"ViewDidLoad");

}

执行的结果如下:

2015-07-02 14:32:33.639 gcd_test[1174:69094] thread = <NSThread: 0x7b678180>{number = 1, name = main}  

2015-07-02 14:32:33.639 gcd_test[1174:69094] ViewDidLoad

2015-07-02 14:32:33.639 gcd_test[1174:69182] block0 add queue <NSThread: 0x7b68f7a0>{number = 2, name = (null)}

2015-07-02 14:32:33.640 gcd_test[1174:69094] ViewDidLoad

2015-07-02 14:32:33.640 gcd_test[1174:69182] block1 add queue <NSThread: 0x7b68f7a0>{number = 2, name = (null)}

2015-07-02 14:32:33.640 gcd_test[1174:69182] block2 add queue <NSThread: 0x7b68f7a0>{number = 2, name = (null)}

可以看到 ViewDidLoad的打印结果在前面,

说明一个异步函数,刚好相反,会立即返回,预定的任务会完成但不会等它完成


我们再看一下dispatch_sync同步函数的执行结果:

2015-07-02 14:35:44.333 gcd_test[1191:70132] thread = <NSThread: 0x7bf85cd0>{number = 1, name = main}  

2015-07-02 14:35:44.334 gcd_test[1191:70132] block0 add queue <NSThread: 0x7bf85cd0>{number = 1, name = main}

2015-07-02 14:35:44.334 gcd_test[1191:70132] block1 add queue <NSThread: 0x7bf85cd0>{number = 1, name = main}

2015-07-02 14:35:44.335 gcd_test[1191:70132] block2 add queue <NSThread: 0x7bf85cd0>{number = 1, name = main}

2015-07-02 14:35:44.336 gcd_test[1191:70132] ViewDidLoad

一个同步函数只在完成了它预定的任务后才返回。也就是说同步函数dispatch_sync阻塞了当前的线程。


在异步任务(dispatch_async)的时候,如果这个队列是串行的队列,队列中任务取出一个,等新的线程执行完毕执行完之后,再取出串行队列中的另一个任务,再由新的线程开始执行。这个感觉挺好理解的。
假如说这个队列是并行队列,假如说有5个线程要执行并行队列中任务,将队列中的任务取出一个,给一个线程。然后,第二个任务不等待第一个任务结束,就取出来给另一个线程。就是说,之所以叫并发队列,就是因为依次取出了好几个任务吗?而不是一个任务完成,再取另一个任务?
刚开始,任务的执行是有顺序的,但是至于谁先执行完是不可预知的


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值