平常开发中会经常用gcd做一下多线程任务,但一直没有对同步、异步任务在串行、并行队列的执行情况做个全面的认识,今天写了个demo跑了下,还是有些新发现的。

代码如下:

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
 
    [self gcdTest];
}
 
-(void)gcdTest
{
 
    dispatch_queue_t serialQueue= dispatch_queue_create("串行队列", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t concurrentQueue=dispatch_queue_create("并行队列", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_queue_t mainQueue=dispatch_get_main_queue();
    dispatch_queue_t globalQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    //1:
//    for(int i=0;i<10;i++){
//        dispatch_sync(serialQueue, ^{
//            NSLog(@"任务执行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
//        });
//    }
    //结果,同步任务在串行队列中,在主线程下串行执行
    
    //2:
//    for(int i=0;i<10;i++){
//        dispatch_sync(concurrentQueue, ^{
//            NSLog(@"任务执行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
//        });
//    }
    //结果,同步任务在并行队列中,在主线程下串行执行
    
    //3:
//    for(int i=0;i<10;i++){
//        dispatch_sync(mainQueue, ^{
//            NSLog(@"任务执行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
//        });
//    }
    //结果,同步任务在主队列中,锁死
    
    //4:
//    for(int i=0;i<10;i++){
//        dispatch_sync(globalQueue, ^{
//            NSLog(@"任务执行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
//        });
//    }
    //结果,同步任务在全局队列中,在主线程下串行执行
    
    //5:
//    for(int i=0;i<10;i++){
//        dispatch_async(serialQueue, ^{
//            NSLog(@"任务执行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
//        });
//    }
    //结果,异步任务在串行队列中,在一个子线程中串行执行
    
    //6:
//    for(int i=0;i<10;i++){
//        dispatch_async(concurrentQueue, ^{
//            NSLog(@"任务执行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
//        });
//    }
    //结果,异步任务在并行队列中,在多个子线程中并行执行
    
    //7:
//    for(int i=0;i<10;i++){
//        dispatch_async(mainQueue, ^{
//            NSLog(@"任务执行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
//        });
//    }
    //结果,异步任务在主队列中,在主线程中串行执行
    
    //8:
    for(int i=0;i<10;i++){
        dispatch_async(globalQueue, ^{
            NSLog(@"任务执行中....-%d\n mainThread:%@",i,[NSThread currentThread]);
        });
    }
    //结果,异步任务在全局队列中,在多个子线程中并行执行
}
 

总结如下:

dispatch_sync:同步任务无论在自定义串行队列、自定义并行队列、主队列(当前线程为主线程时会出现死锁)、全局队列 执行任务时,都不会创建子线程,而是在当前线程中串行执行;

dispatch_async:异步任务无论在自定义串行队列、自定义并行队列(主队列除外,主队列下,任务会在主线中串行执行)、全局队列 执行任务时,都会创建子线程,并且在子线程中执行;

GCD中的dispatch_sync、dispatch_sync 分别与串行、并行队列组合执行小实验的更多相关文章

  1. GCD死锁,及同步、异步、串行和并行队列组合情形

      一.概述 1)队列用来存储代码任务,线程用来运行代码任务: 2)main()函数作为程序入口,整个程序默认运行在主线程中,程序代码任务默认存放在主队列中: 3)以下所谓阻塞线程是针对主线程而言(子 ...

  2. iOS:GCD理解1(同步-异步、串行-并行)

    1.并行-异步(ST1与ST2抢占资源) 1-1).获取 并行(全局)队列 ,DISPATCH_QUEUE_PRIORITY_DEFAULT 为默认优先级. dispatch_queue_t queu ...

  3. IOS多线程知识总结/队列概念/GCD/串行/并行/同步/异步

    进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间: 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程. 队列:dis ...

  4. GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例

    转:http://www.tuicool.com/articles/NVVnMn (1)GCD实现的同步异步.串行并行. ——同步sync应用场景:用户登录,利用阻塞 ——串行异步应用场景:下载等耗时 ...

  5. 【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例

    (1)GCD实现的同步异步.串行并行. --同步sync应用场景:用户登录,利用堵塞 --串行异步应用场景:下载等耗时间的任务 /** * 由于是异步.所以开通了子线程.可是由于是串行队列,所以仅仅须 ...

  6. iOS多线程——同步异步串行并行

    串行并行异步同步的概念很容易让人混淆,关于这几个概念我在第一篇GCD中有解释,但是还不够清晰,所以这里重写一篇博客专门对这几个概念进行区分: 先说一下队列和任务: (1)队列分为串行和并行,任务的执行 ...

  7. 串行&并行&并发,同步&异步

    1. 串行&并行&并发 1.1 串行 这个非常好理解,字面意思,像串成一个串一样,顺序执行 上一个没执行完的话,后面的就必须无条件等待 一般情况就是一个线程里:任务一个接一个执行,类似 ...

  8. GCD同步异步 串行并行大解析

    /** 核心概念 任务:block里需要执行的操作 队列:把任务添加进入队列中,按照先进先出的原则来执行任务  串行队列:一个一个的执行 并行队列:可以让多个任务并发(同时)执行(自动开启多个线程同时 ...

  9. GCD,用同步/异步函数,创建并发/串行队列

    队列  第一个参数:C语言字符串,标签 第二个参数: DISPATCH_QUEUE_CONCURRENT:并发队列 DISPATCH_QUEUE_SERIAL:串行队列 dispatch_queue_ ...

随机推荐

  1. Spring RMI (Spring 远程方法调用)

    所需jar包...?    不纠结,一股脑儿全导! 源码地址:http://pan.baidu.com/s/1jG8eOmy 先放结构图如下,客户端和服务端都在一个项目中.也可以把服务端的xxx导成j ...

  2. HTML中doctype以及target论述

    首先,为什么要在每个html文档开头写入<!doctype......>呢.                                                         ...

  3. html file控件选择文件后立即预览 js实现

    //上传图片后立即预览 file对象,图片容器id function showImg(fileObj,imgId) { var file=fileObj.files[0]; var r = new F ...

  4. 数据字典和动态性能视图<五>

    数据字典和动态性能视图 介绍:数据字典是什么 数据字典是 oracle 数据库中最重要的组成部分,它提供了数据库的一些系统信息. 动态性能视图记载了例程启动后的相关信息.  数据字典 数据字典记录了 ...

  5. live555 直播arm-linux视频

    live555例程testOnDemandRTSPServer.cpp启动一个流服务器 首先启动使用环境, TaskScheduler* scheduler = BasicTaskScheduler: ...

  6. Mac 系统下类似于 apt-get 的软件包管理器 -- Homebrew

    对于一个习惯了在 Ubuntu 的终端上通过 apt-get 来安装工具软件的我来说,也希望在Mac上找到类似的工具,能很方便的一条命令就能安装所需的软件,而不用手工的去查找下载编译,或者是折腾安装所 ...

  7. PowerDesigner 建模

    File—New Model—Physical Data Model—Physical Diagram—Model name设置为test,DBMS属性设置为Microsoft SQL Server  ...

  8. 基本套接字编程(2) -- I/O模型篇

    1. I/O模型简介 最近一直在学习Unix网络编程,被Unix下各种I/O模型搞得头昏脑涨,结合<Unix网络编程 - 卷一>第六章 并参考了网上各牛们的分析,稍稍厘清了一些.因此记录下 ...

  9. asp控件Repeater运用

    双层repeater嵌套 <asp:Repeater ID="rpt_dataRepeatgroup" runat="server" OnItemData ...

  10. Ubuntu下修改hosts文件

    Ubuntu系统的Hosts只需修改/etc/hosts文件,修改完之后要重启网络.具体过程如下:1.修改hostssudo gedit /etc/hosts2.添加解析记录( . )或者从githu ...