zoukankan      html  css  js  c++  java
  • ios多线程 -- GCD介绍

    GCD (纯C语言) 全称 Grand Central Dispatch,可译为“伟大的中枢调度器”

    优点:
    (1) GCD是为多核并行运算提出的解决方案
    (2) GCD会自动利用更多的CPU内核(比如双核、四核)
    (3) GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)
    (4) 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码

    核心概念:
    (1) 任务(block):执行什么任务
    (2) 队列(queue):用来存放任务

    使用步骤:
    (1) 定制任务:确定要执行的操作
    (2) 将任务添加到队列中: GCD 会自动将队列中的任务取出,放到对应的线程来执行;任务的取出遵守队列的 FIFO 原则 (先进先出).

    GCD执行任务的常用函数
    (1) 用同步的方式

    /**
         *  参数说明
         *  @param queue 队列
         *  @param void  任务
         */
        dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)

    (2) 用异步的方式

    dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)

    同步异步区别:
    (1) 同步: 只能在当前线程中执行, 不具备开启线程的能力
    (2) 异步: 可以在新线程中执行, 具备开启线程的能力.

    GCD队列的类型(3种)
    并发队列(全局队列):可以让对个任务并发(同时)执行, 自动开启多个线程,同时执行任务;(并发的功能只能在异步执行的时候才有效).

    /**
         * 优先级
         * DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高
         * DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默认(中)
         * DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低
         * DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后台
         */
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    串行队列:让任务一个接一个执行,一个任务执行完毕,才能执行下一个任务.

    dispatch_queue_t queue = dispatch_queue_create("xiaocai", NULL);
    //dispatch_release(queue); // 非ARC需要释放手动创建的队列

    串行队列的特殊情况:主队列:

    dispatch_get_main_queue()

    补充:
    同步和异步:主要影响能不能开启新的线程

    • 同步:不具备开启新线程的能力
    • 异步:具备开启线程的能力

    并发和串行主要影响任务的执行方式

    • 并发: 多个任务并发(同时)执行
    • 串行:一个任务执行完毕,下一个任务才开始执行.

    组合方式
    异步 并发队列(最常用)

    /** 
        异步(dispatch_async)  并发队列(全局队列)(最常用)
        会创建线程,一次开多条, 并行的执行任务
     */
    - (void)createAsynGload{
        //创建并发队列(全局队列)
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_async(queue, ^{
            [self downLoad:@"http://ThreadA"];
        });
    
        dispatch_async(queue, ^{
            [self downLoad:@"http://ThreadB"];
        });
    
        dispatch_async(queue, ^{
            [self downLoad:@"http://ThreadD"];
        });
    
        dispatch_async(queue, ^{
            [self downLoad:@"http://ThreadE"];
        });
    
        dispatch_async(queue, ^{
            [self downLoad:@"http://ThreadF"];
        });
    
        dispatch_async(queue, ^{
            [self downLoad:@"http://ThreadG"];
        });
    }
    

    异步并发

    异步 串行队列(偶尔用)

    /**
     异步(dispatch_async)  串行队列(有时用)
     会创建线程,一般开一条, 串行的执行任务
     */
    - (void)createAsynQueue{
        //创建队列(串行队列,依次执行)
        dispatch_queue_t queue = dispatch_queue_create("xiaocai", NULL);
    
        dispatch_async(queue, ^{
            [self downLoad:@"http://ThreadA"];
        });
    
        dispatch_async(queue, ^{
            [self downLoad:@"http://ThreadB"];
        });
    
        dispatch_async(queue, ^{
            [self downLoad:@"http://ThreadD"];
        });
    
        dispatch_async(queue, ^{
            [self downLoad:@"http://ThreadE"];
        });
    
        dispatch_async(queue, ^{
            [self downLoad:@"http://ThreadF"];
        });
    
        dispatch_async(queue, ^{
            [self downLoad:@"http://ThreadG"];
        });
    
    }
    

    异步串行

    异步 主队列(经常用)

    /**
     异步(dispatch_async)  主队列(很常用)
     不会创建线程,在主线程中执行任务
     */
    - (void)createAsynMainQueue{
        dispatch_queue_t mianQueue = dispatch_get_main_queue();
        dispatch_async(mianQueue, ^{
            [self downLoad:@"http://ThreadA"];
        });
    
        dispatch_async(mianQueue, ^{
            [self downLoad:@"http://ThreadB"];
        });
    
        dispatch_async(mianQueue, ^{
            [self downLoad:@"http://ThreadD"];
        });
    
        dispatch_async(mianQueue, ^{
            [self downLoad:@"http://ThreadE"];
        });
    
        dispatch_async(mianQueue, ^{
            [self downLoad:@"http://ThreadF"];
        });
    
        dispatch_async(mianQueue, ^{
            [self downLoad:@"http://ThreadG"];
        });
    }
    

    异步主队列

  • 相关阅读:
    caffe中的sgd,与激活函数(activation function)
    image retrieval数据集
    八卦
    caffe的损失函数
    caffe的输入
    rcnn spp_net hcp
    js实现幻灯片播放图片示例代码
    Checbox的操作含已选、未选及判断代码
    shell中case的用法学习笔记
    linux bash shell中case语句的实例
  • 原文地址:https://www.cnblogs.com/xiaocai-ios/p/7779777.html
Copyright © 2011-2022 走看看