平常开发中会经常用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. CSS3凹凸字

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  2. __new__

    [__new__] object.__new__(cls[, ...]) Called to create a new instance of class cls. 用于创建类对象cls的实例. __ ...

  3. Echarts 合并版本

    1) Echarts x轴显示不全 解决办法:x轴加上如下代码. axisLabel:{ interval:0 } 2) tooltip文字没有左对齐 解决办法:tooltip加入如下代码. text ...

  4. scala 闭包的概念

    闭包本质上是一个函数和其引用的变量的统一定义,它的返回值依赖于这个函数外部的一个或者多个变量. var test = (i:Int) => i+sum 这里 i是一个形参, 随着函数的调用传入不 ...

  5. Hex编码字节

    1.将字节数组转换为字符串 /** * 将字节数组转换为字符串 * 一个字节会形成两个字符,最终长度是原始数据的2倍 * @param data * @return */ public static ...

  6. 如何在asp.net中使用多线程及队列,异步处理一个耗时的任务(原创)

    最近想在使用.net 的队列处理一些耗时的工作.经过考虑,需要先设计一个类,类中包含一个静态的队列.主要是写队列和读取队列. public class PaperCalculator { // 用于存 ...

  7. Two-Phase Commit (两阶段提交)

    1. 流程 1) Coordinator (协调者) 广播 VOTE-REQ 给所有 Participant (参与者) 2) Coordinator 等待 Participant 的结果 3) Pa ...

  8. ng-repeat指令应用

    1.ng-repeat 一看就知道跟foreach等指令类似,用于循环重复.一般用于列表和表格中.用法如下: <tr ng-repeat="data in dataList" ...

  9. unreal3的坐标系统和vector/rotator

    unreal3的坐标系有点奇葩,属于[z轴向上的左手坐标系]: 1.左手食指指前方,x正向 2.大拇指指上方,z正向 3.中指指右方,y正向 若以我们人头摆正时来参考: 1.目视的是前方,x正向 2. ...

  10. 日志log使用序列反序列加密(Serializer) DESCrypto 加密

    若一次加密一个文件内容,文件内容不会更新变化,网上大多数序列化反序列加密程序是没问题的. 1:由于log文件的随时会更新内容,那网上常用的程序是行不通的.需要做修改 若想通过打开txt , using ...