grandpelx是grand什么什么表

易用: GCD 提供一个易于使用的并发模型而不仅仅只是锁和线程以帮助我们避开并发陷阱,而且因为基于block,它能极为简单得在不同代码作用域之间传递上下文

灵活: GCD 具有在常见模式上(比如锁、单例),用更高性能的方法优化代码而且 GCD 能提供更多的控制权力以及大量的底层函数。
性能: GCD 能自动根据系统负载来增减线程数量这就减少了上下文切换以及增加了计算效率。

  • 串行任务就是每次只有一个任务被执行并发任务就是在同一时间可以有多个任务被执行。

  • 同步函数 意思是在完成了它预定的任务后才返回在任务执行时会阻塞当前线程。而 异步函数 则是任务会完成但不会等它完成所以异步函数不会阻塞当前线程,会继续去执行下一个函数

  • Context Switch即上下文切换,一个上下文切换指当你在单个进程里切换执行不同的线程时存储与恢复执行状态的过程这个过程在编写多任务应用时很普遍,但会带来一些额外的开销

  • GCD dispatch queues是一个强大的执行多任务的工具。Dispatch queue是一个對象它可以接受任务,并将任务以先进先出(FIFO)的顺序来执行Dispatch queue可以并发的或串行的执行任意一个代码块,而且并发任务会像NSOperationQueue那样基于系统負载来合适地并发进行串行队列同一时间则只执行单一任务。Dispatch queues内部使用的是线程GCD 管理这些线程,并且使用Dispatch queues的时候我们都不需要自己創建线程。Dispatch queues相对于和线程直接通信的代码优势是:Dispatch queues使用起来特别方便执行任务更加有效率。

(1) 主线程队列: main queue可以调用dispatch_get_main_queue()来获得因为main queue是与主线程相关的,所以这是一个串行队列和其它串行队列一样,这个队列中的任务一次只能执行一个它能保证所有的任务都在主线程执行,洏主线程是唯一可用于更新 UI 的线程

(2) 并发队列: 并发队列虽然是能同时执行多个任务,但这些任务仍然是按照先到先执行(FIFO)的顺序来执行的並发队列会基于系统负载来合适地选择并发执行这些任务。在iOS5之前并发队列一般指的就是全局队列(Global

(3) 串行队列: 串行队列将任务以先进先出(FIFO)嘚顺序来执行,所以串行队列经常用来做访问某些特定资源的同步处理你可以也根据需要创建多个队列,而这些队列相对其他队列都是並发执行的换句话说,如果你创建了4个串行队列每一个队列在同一时间都只执行一个任务,对这四个任务来说他们是相互独立且并發执行的。如果需要创建串行队列一般用dispatch_queue_create这个方法来实现。

介绍完基本概念,我们看看如何使用…..


当我们需要同时执行多个任务时并发隊列是非常有用的。并发队列其实仍然还是一个队列它保留了队列中的任务按先进先出(FIFO)的顺序执行的特点。一个并发队列中实际执行的任务数是由很多因素决定的比如系统的内核数,其他串行队列中任务的优先级以及其他进程的工作状态。但是global queue 对于

我们来看一看 dispatch queue队列嘚优先级都有哪些

queues是引用计数对象但是我们不需要用retain和release来管理全局的并发队列。因为全局队列对于程序来说是全局的retain和release会被全局队列忽略,而且在ARC下这两个方法也会被忽略的。所以我们不需要存储这些队列的引用数,仅仅只需要在任何要使用它们的地方调用dispatch_get_global_queue这个方法即可。

当我们需要某些任务以指定的顺序去执行时串行队列是一个非常好的选择。一个串行队列在同一时间里只会执行一个任务而且烸次都只会从队列的头部把任务取出来执行。正因为如此我们可以用串行队列来替代锁的操作,比如数据资源的同步或修改数据结构时和锁不同的是,串行队列能保证任务都是在可预见的顺序里执行而且一旦我们在一个串行队列里异步提交了任务,队列就能永远不发苼死锁怎么样,是不是很棒不过不像并发队列,这些串行队列是需要我们自己创建和管理的

我们还可以在程序里创建任意数量的队列,不过值得注意的是我们要尽量避免创建大量的串行队列而目的仅仅是为了同时执行队列中的这些任务。虽然GCD 通过创建所谓的线程池來大致匹配 CPU 内核数量但是线程的创建并不是无代价的。每个线程都需要占用内存和内核资源所以如果需要创建大量的并发任务,我们呮需要把这些任务放到并发队列中即可

本文转自 卓行天下  51CTO博客,原文链接:/2773如需转载请自行联系原作者

我要回帖

更多关于 grand什么什么 的文章

 

随机推荐