平常开发中会经常用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. asp.net mvc 如何将controller 里一个action 返回值为list<>的值输出到view

    在controller中:return View(myRole.ToList());在view文件开头加上:@model IEnumerable<LTXYCallCenter.Models.Ro ...

  2. scala 闭包的概念

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

  3. docker创建镜像的几个命令

    docker create -it --name mongodb mongo/myubuntu1. docker start mongodbdocker exec -it mongodb bash i ...

  4. C#WebClient常见用法

    System.Net.WebClient.DownloadFile(Uri address, String fileName) namespace:System.Net 参数: address:The ...

  5. github的一些指令

  6. Scanf函数输入字符串

    Scanf函数输入字符串 #define _CRT_SECURE_NO_WARNINGS //#pragma warning(disable:4996) #include <stdio.h> ...

  7. aspectj pointcut 找不到类型pointcut cannot be resolved to a type

    引入了aspectJ后,文件提示找不到pointcut类型.修改如下: .project文件添加内容,红色字体为添加的引用 <?xml version="1.0" encod ...

  8. C++变量的左值和右值

    变量和文字常量都有存储区,并且有相关的类型. 区别在于变量是寻址的,对于每一个变量,都有两个值与其相关联 1  它的数据值,存储在某个内存地址中.有时这个值也被称为对象的右值 文字常量和变量都可被用作 ...

  9. 学习python之练习(一)

    #1.计算1000以内3与5的倍数的总和 import math nums = 0 for i in range(0,1000): if i%3 == 0 or i%5 == 0 : if i != ...

  10. 并查集+关系的传递(poj 1182)

    题目:食物链 题意:给定一些关系.判断关系的正确性,后给出的关系服从之前的关系: 思路:难点不在并查集,在于关系的判断,尤其是子节点与根节点的关系的判断: 这个关系看似没给出,但是给出子节点与父节点的 ...