关于gcd一些自己的理解。

gcd这个东西对于开发ios的人应该都听说过,但是很多东西感觉理解起来感觉是有点问题。今天又看了一些关于gcd的东西,现在来说说一些我自己对理解。

我认为gcd最重要的事理解队列,还有同步任务,和异步任务。

首先是队列这个东西,很多人一开始会认为一个队列就是一个线程。这个认知是错误的,队列是什么,其实就是任务的一个集合,一个怎么样的队列决定了你里面的任务是怎么样调度的。

下面是我今天看到一个人对于队列的理解。我感觉十分的透彻。

串行队列:队列里面的任务只能一个一个的调度,比如说你三个下载图片任务,现在你只能一张一张的下载,并不能在后台同时下载三张图片。

并行队列:跟上面相反,可以同时调度三个任务,图片能在后台同时下载。

同步任务:当前指令不完成,无法进行下个指令。

怎么理解这句话,首先我们知道我们的队列都是先进先出的,下面我们来创建一个并行队列,然后同步执行下面的任务

 dispatch_queue_t queue=dispatch_queue_create("queue1", DISPATCH_QUEUE_CONCURRENT);//创建一个并行队列
    //同步运行
    dispatch_sync(queue, ^{
        NSLog(@"11111   %@",[NSThread currentThread]);
    });

    dispatch_sync(queue, ^{
        NSLog(@"2222    %@"    ,[NSThread currentThread]);
    });

    dispatch_sync(queue, ^{
        NSLog(@"3333   %@",[NSThread currentThread]);
    });

发现了什么问题,虽然是并行队列,意思就是可以调度几个任务的队列,但是执行的时候依然是一个一个的运行,并没有开启新的线程,都还是在主线程运行的。

为什么会造成这样的情况,就是同步任务的原因了。上面说了,同步任务就是当前指令没有执行完,下一条指令不能执行。根据先入先进的原因,我们需要执行的第一句话肯定是打印“1111”.所以这条指令没有执行完成的时候,是不能执行打印@“2222”这条指令的,当我们执行打印@“2222”这条指令的时候,打印“3333”这条指令当然也不能执行。所以即使是并行队列,但是执行的同步任务的话也并不会同时运行几个任务,因为没有必要,你必须执行完上一条指令的时候才能执行下一条。所以即使开启了线程也没用。

异步任务:就是你当前指令即使并没有执行完,你依然能执行下一个指令。

 dispatch_queue_t queue=dispatch_queue_create("queue1", DISPATCH_QUEUE_CONCURRENT);//创建一个并行队列
    //异步执行任务
    dispatch_async(queue, ^{
        NSLog(@"11111   %@",[NSThread currentThread]);
    });

    dispatch_async(queue, ^{
        NSLog(@"2222    %@"    ,[NSThread currentThread]);
    });

    dispatch_async(queue, ^{
        NSLog(@"3333   %@",[NSThread currentThread]);
    });

现在就能同时执行三个打印了。而且都在不同的线程执行。

我们现在来继续验证一下这个想法,我们将打印@“1111”设为同步任务,打印“2222”也变成同步任务并睡眠两秒,打印“3333”设为异步任务,来看看会怎么样

    dispatch_queue_t queue=dispatch_queue_create("queue1", DISPATCH_QUEUE_CONCURRENT);//创建一个并行队列

    dispatch_sync(queue, ^{
        NSLog(@"11111   %@",[NSThread currentThread]);
    });

    dispatch_sync(queue, ^{
        [NSThread sleepForTimeInterval:2.0f];
        NSLog(@"2222    %@"    ,[NSThread currentThread]);
    });

    dispatch_async(queue, ^{
        NSLog(@"3333   %@",[NSThread currentThread]);
    });

你会发现,异步任务依然是等到了同步任务都完成之后再执行的。

还有个东西就主队列,在主队列里面进行异步操作会死锁。为什么会这样啦?

因为主队列有个特性,如果主线程里面有任务是不会进行任务的调度的,但是主线程是肯定一直有任务的在运行的,因为主线成需要监视我们是否有UI操作之类的东西,所以不可能主线程有没有任务的时候。所以比如我们平时写的代码都是在主队列中异步操作的。

时间: 2024-10-18 08:52:22

关于gcd一些自己的理解。的相关文章

iOS多线程开发之GCD 用法入门

我们知道,在iOS中进行多线程编程,主要有三种方式:[NSThread].[NSOperation]和[GCD].其中又以[GCD]为苹果官方最为推荐.本文将利用一个简单的demo,简述GCD的用法入门,以及本人对GCD的一点肤浅理解和学习心得. 先把参考文章列出: http://www.cnblogs.com/kenshincui/p/3983982.html http://www.cnblogs.com/sunfrog/p/3305614.html http://mobile.51cto.c

【iOS沉思录】NSThread、GCD、NSOperation多线程编程总结

OC中的多线程 OC中多线程根据封装程度可以分为三个层次:NSThread.GCD和NSOperation,另外由于OC兼容C语言,因此仍然可以使用C语言的POSIX接口来实现多线程,只需引入相应的头文件:#include <pthread.h>. NSThread NSThread是封装程度最小最轻量级的,使用更灵活,但要手动管理线程的生命周期.线程同步和线程加锁等,开销较大: NSThread的基本使用比较简单,可以动态创建初始化NSThread对象,对其进行设置然后启动:也可以通过NST

iOS GCD中级篇 - dispatch_group的理解及使用

前文我们讲了GCD基础篇,以及同步.异步,并发.并行几个概率的理解. 参考链接: iOS GCD基础篇 - 同步.异步,并发.并行的理解 现在讲一下dispatch_group的概念以及几种场景下的使用 1.关于dispatch_group 把一组任务提交到队列中,这些队列可以不相关,然后监听这组任务完成的事件. 最常见的几个方法: 1.dispatch_group_create创建一个调度任务组 2.dispatch_group_async 把一个任务异步提交到任务组里 3.dispatch_

对GCD的一些理解和实践

GCD GCD,全程Grand Central Dispatch,是苹果为了多核并行提出的解决方案.它是使用C语言实现,但是由于用了block来处理回调,所以使用起来十分方便.并且GCD会自动管理线程的生命周期,不需要我们去管理. 任务和队列 GCD中有两个重要的概念,任务和队列. 1.任务,就是我们想要处理的事情,任务可以分为同步执行和异步执行: 同步(sync):使用dispatch_sync(dispatch_queue_t queue, dispatch_block_t block) 创

GCD的个人理解和应用

GCD的个人理解和应用 特点 >>将GCD封装,使我们从繁琐的方法记忆中解脱出来,能够直接快速的应用. 使用方法 1.将工程中的GCD文件中的9个文件拖入自己的工程中(你自己最好建一个文件夹,用来保存这几个文件,方便管理!). 2.在所要用到GCD的view中,导入GCD.h文件 3.封装的GCD文件参见:(https://github.com/YouXianMing/GCD-Program) 源码 1.对GCD封装的源码,在这里下载(https://github.com/YouXianMin

iOS开发:深入理解GCD 第一篇

最近把其他书籍都放下了,主要是在研究GCD.如果是为了工作,以我以前所学的GCD.NSOperation等知识已经足够用了,但学习并不仅仅知识满足于用它,要知其然.并且知其所以然,这样才可以不断的提高自身技术水平. 本文主要参考http://www.raywenderlich.com/60749/grand-central-dispatch-in-depth-part-1 和 <iOS与OS X 多线程和内存管理>,以及其他一些杂七杂八的书籍或者博客. GCD已经面世很久了,基于GCD面向对象

GCD 深入理解:第一部分

虽然 GCD 已经出现过一段时间了,但不是每个人都明了其主要内容.这是可以理解的:并发一直很棘手,而 GCD 是基于 C 的 API ,它们就像一组尖锐的棱角戳进 Objective-C 的平滑世界.我们将分两个部分的教程来深入学习 GCD . 在这两部分的系列中,第一个部分的将解释 GCD 是做什么的,并从许多基本的 GCD 函数中找出几个来展示.在第二部分,你将学到几个 GCD 提供的高级函数. 什么是 GCD GCD 是 libdispatch 的市场名称,而 libdispatch 作为

iOS开发:深入理解GCD 第二篇(dispatch_group、dispatch_barrier、基于线程安全的多读单写)

Dispatch Group在追加到Dispatch Queue中的多个任务处理完毕之后想执行结束处理,这种需求会经常出现.如果只是使用一个Serial Dispatch Queue(串行队列)时,只要将想执行的处理全部追加到该串行队列中并在最后追加结束处理即可,但是在使用Concurrent Queue 时,可能会同时使用多个Dispatch Queue时,源代码就会变得很复杂. 在这种情况下,就可以使用Dispatch Group. 1 2 3 4 5 6 7 8 9 10 11 12 13

GCD 深入理解(一)

本文由@nixzhu翻译至raywenderlich的<grand-central-dispatch-in-depth-part-1> 虽然 GCD 已经出现过一段时间了,但不是每个人都明了其主要内容.这是可以理解的:并发一直很棘手,而 GCD 是基于 C 的 API ,它们就像一组尖锐的棱角戳进 Objective-C 的平滑世界.我们将分两个部分的教程来深入学习 GCD . 在这两部分的系列中,第一个部分的将解释 GCD 是做什么的,并从许多基本的 GCD 函数中找出几个来展示.在第二部分