GCD中的队列与任务

 一、简介:

  Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法。它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统。它是一个在线程池模式的基础上执行的并行任务。在Mac OS X 10.6雪豹中首次推出,也可在IOS 4及以上版本使用。

GCD是一个替代诸如NSThread等技术的很高效和强大的技术。GCD完全可以处理诸如数据锁定和资源泄漏等复杂的异步编程问题。GCD的工作原理是让一个程序,根据可用的处理资源,安排他们在任何可用的处理器核心上平行排队执行特定的任务。这个任务可以是一个功能或者一个程序段。

GCD仍然在一个很低的水平使用线程,但是它不需要程序员关注太多的细节。GCD创建的队列是轻量级的,苹果声明一个GCD的工作单元需要由15个指令组成。也就是说创造一个传统的线程很容易的就会需要几百条指令。

  GCD中的一个任务可被用于创造一个被放置于队列的工作项目或者事件源。如果一个任务被分配到一个事件源,那么一个由功能或者程序块组成的工作单元会被放置于一个适当的队列中。苹果公司认为GCD相比于普通的一个接一个的执行任务的方式更为有效率。(来自百科)

  二、队列

  GCD的所有的调度队列都是先进先出队列,因此,队列中的任务的开始的顺序和添加到队列中的顺序相同。我们可以将部分独立运行的任务添加到对列,由系统管理执行。

  GCD队列主要有三种,系统主队列 main_queue、全局并发队列 global_queue和自定义队列

  • 并发队列     队列中的任务必须在前一个任务开始后才能执行
  1. 同步串行队列:队列的执行任务与主线程是同步的,会阻塞主线程
  2. 异步串行队列:队列的执行任务与主线程是异步的
  • 串行队列     队列中的任务必须在前一个任务结束后才能执行(可替代线程锁)
  1. 同步串行队列:队列的执行任务与主线程是同步的,会阻塞主线程
  2. 异步串行队列:队列的执行任务与主线程是异步的

  三、队列的创建

  1. 自定义串行队列,提交同步任务

     //1.创建串行队列、提交同步任务
        dispatch_queue_t queue = dispatch_queue_create("queueName", DISPATCH_QUEUE_SERIAL);
    
        dispatch_sync(queue, ^{
            //code 任务一
        });
    
        dispatch_sync(queue, ^{
            //code 任务二
        });
    

      队列中的任务是同步出列的,任务一执行结束后执行任务二。这种类型的任务与主线程是同步的,会阻塞主线程

  2. 自定义串行队列,提交异步任务
    //1.创建串行队列、提交异步任务
        dispatch_queue_t queue = dispatch_queue_create("queueName", DISPATCH_QUEUE_SERIAL);
    
        dispatch_async(queue, ^{
            //code 任务一
        });
    
        dispatch_async(queue, ^{
            //code 任务二
        });
    

      队列的任务是同步出列,任务一执行结束后执行任务二。该类型的任务与主线程是并发执行的,不会阻塞主线程 

  3. 自定义并行队列,提交同步任务
    // 创建并行队列、提交同步任务
        dispatch_queue_t queue = dispatch_queue_create("queueName", DISPATCH_QUEUE_CONCURRENT);
        dispatch_async(queue, ^{
            //code 任务一
        });
        dispatch_async(queue, ^{
            //code 任务二
        });
    

      队列的任务是异步出列,任务的出列顺序按先进先出的顺序执行,既任务一出列后任务二接着出列(任务一与任务二又是同步的),与主线程同步,会阻塞主线程

  4. 自定义并行队列,提交异步任务
    //创建并行队列、提交异步任务
        dispatch_queue_t queue = dispatch_queue_create("queueName", DISPATCH_QUEUE_CONCURRENT);
        dispatch_async(queue, ^{
            //code 任务一
        });
        dispatch_async(queue, ^{
            //code 任务一
        });
    

      任务一出列后任务二才可以出列,各任务之间是异步的,不会阻塞主线程

  5. 在主队列提交同步任务

    //在主队列提交同步任务
        dispatch_sync(dispatch_get_main_queue(), ^{
            //code
        });
    

      阻塞主线程

  6. 在主队列提交异步任务

    //在主队列提交异步任务
        dispatch_async(dispatch_get_main_queue(), ^{
            //code任务
        });
    

      

  7. 在全局队列提交同步任务

     //在全局队列提交同步任务
     dispatch_sync(dispatch_get_global_queue(0, 0), ^{
         //code
     });
    

      

  8. 在全局队列提交异步任务

    //在全局队列提交异步任务
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            //code
        });
    

      

    dispatch_get_gloabal_queue 的第一个参数为枚举类型(默认为0),决定任务的优先级 ,第二个参数为Apple保留参数,传0
    #define DISPATCH_QUEUE_PRIORITY_HIGH        2
    #define DISPATCH_QUEUE_PRIORITY_DEFAULT     0
    #define DISPATCH_QUEUE_PRIORITY_LOW         (-2)
    #define DISPATCH_QUEUE_PRIORITY_BACKGROUND  INT16_MIN(后台任务,优先级最低)

  四、总结

    队列的类型决定了队列任务的执行方式(主队列是一个串行队列)。一般把会阻塞主线程的任务提交到异步并行队列当中。

时间: 2024-10-12 20:42:16

GCD中的队列与任务的相关文章

关于GCD中的队列

队列分为串行队列,并发队列,全局队列和主队列: 串行队列:一次只能安排一个任务. dispatch_queue_t q = dispatch_queue_create("itcast",DISPATCH_QUEUE_SERIA); DISPATCH_QUEUE_SERIAL==NULL: 并发队列:一次可安排多个任务. dispatch_queue_t q = dispatch_queue_create("itcast", DISPATCH_QUEUE_CONCUR

iOS开发 多线程(一)GCD中dispatch队列知识

GCD编程的核心就是dispatch队列,dispatch block的执行最终都会放进某个队列中去进行,它类似NSOperationQueue但更复杂也更强大,并且可以嵌套使用.所以说,结合block实现的GCD,把函数闭包(Closure)的特性发挥得淋漓尽致. dispatch队列的生成可以有这几种方式: 1. dispatch_queue_t queue = dispatch_queue_create("com.dispatch.serial", DISPATCH_QUEUE_

GCD中不同队列 配合 不同函数的 情况分析

两种函数: 1>sync     同步函数, 2>async   异步函数, 四种队列: 1>main queue  主队列 2>手动创建的串行队列 3>全局并发队列 4>手动创建的并发队列 程序验证的就是两种函数分别配合四种队列的执行情况:共八种.全局并发队列和创建的并发队列执行效果是相同的,没有给出. 结果: 1>死锁,前面文章有过介绍,补充一点是:主线程在当前队列中添加任务才会死锁,添加到其他队列不会 2>同步函数配合四种队列都不会开启新的线程 3&g

iOS多线程中,队列和执行的排列组合结果分析

本文是对以往学习的多线程中知识点的一个整理. 多线程中的队列有:串行队列,并发队列,全局队列,主队列. 执行的方法有:同步执行和异步执行.那么两两一组合会有哪些注意事项呢? 如果不是在董铂然博客园看到这边文章请 点击查看原文 提到多线程,也就是四种,pthread,NSthread,GCD,NSOperation 其中phtread是跨平台的.GCD和NSOperation都是常用的,后者是基于前者的. 但是两者区别:GCD的核心概念是将一个任务添加到队列,指定任务执行的方法,然后执行. NSO

GCD 中Group的使用

使用Group实现:先执行一系列操作(在group中),执行完成后再执行别的操作. 1.创建group及任务队列(目的是让group中的所有任务执行完再执行别的任务) dispatch_group_t group = dispatch_group_create(); //创建一个group        dispatch_queue_t globeQ = dispatch_get_global_queue(0, 0); //该方法获取全局队列(每一次得到的都是同一个队列)    2.提交任务到g

GCD中一些API的使用

GCD中一些API的使用 1.串行队列和并行队列 iOS中线程分为串行队列和并行队列,串行队列指的是任务按照先后顺序,依次执行:并行队列指的是任务不按照加入的先后顺序,并发的执行. iOS中串行队列通过如下方式进行创建 dispatch_queue_t queue = dispatch_queue_create("cn.bourbonz.www", DISPATCH_QUEUE_SERIAL); 需要注意的是,引号中的内容表示的是对该队列的描述,后面的参数代表的是串行队列. 并行队列通

java中使用队列:java.util.Queue (转)

Queue接口与List.Set同一级别,都是继承了Collection接口.LinkedList实现了Queue接 口.Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果是Queue时,就完全只能访问Queue接口所定义的方法 了,而不能直接访问 LinkedList的非Queue的方法),以使得只有恰当的方法才可以使用.BlockingQueue 继承了Queue接口. 队列是一种数据结构.它有两个基本操作:在队列尾部加人一个元素,和从队列头部移除一个元素就

GCD中如何延迟处理任务

在实际的开发中,经常会遇到想要在指定的时间间隔后执行某个处理 <一>在GCD中提供了dispatch_after函数来完成这一操作 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(<#delayInSeconds#> * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ <#code to be executed after a specified delay#>

python多进程中的队列数据共享问题

0x00 起 今天在写一个小东西的时候,需要控制并发量,但又不能直接调用python multiprocessing(问题会在文后提到).于是尝试用Queue来实现. 最一开始的思路是这样的: from multiprocessing import Process from Queue import Queue q = Queue(maxsize = 10) # 通过web应用往队列中添加数据 def put(num): q.put(num) def read(): while True: pr