iOS:对GCD中 同步、异步、并行、串行的见解
1、GCD-同步执行多线程时 GCD中不管向什么类型的队列加同步任务,实际上都会加到当前线程中(一般为主线程)。
2、GCD-异步执行多线程时 GCD中不管向什么类型的队列加同步任务,实际上都会加到新开辟的新线程中(不是主线程)。
举例如下:通过演示线程地址来佐证上述观点.......
情况一:GCD-同步 GCD中向并行队列加同步任务,实际上都会加到当前线程中。
//当前主线程
NSLog(@"当前线程:%@",[NSThread currentThread]);//获取一个全局的并行队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ); //同步添加任务
dispatch_sync(queue, ^{
NSLog(@"任务1,当前线程:%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"任务2,当前线程:%@",[NSThread currentThread]);
});
运行结果如下:可以看出这些任务都被加到了mian主线程中,这是所谓的多线程执行成为单一线程执行。
-- ::12.652 -GCD-sync[:] 当前线程:<NSThread: 0x7fba88d16870>{number = , name = main}
-- ::12.652 -GCD-sync[:] 任务1,当前线程:<NSThread: 0x7fba88d16870>{number = , name = main}
-- ::12.653 -GCD-sync[:] 任务2,当前线程:<NSThread: 0x7fba88d16870>{number = , name = main}
====================================================================
情况二:GCD-同步 GCD中向串行队列加同步任务,实际上都会加到当前线程中。
//当前主线程
NSLog(@"当前线程:%@",[NSThread currentThread]); // 创建一个自定义的串行队列
dispatch_queue_t myqueue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_CONCURRENT); //同步添加任务
dispatch_sync(myqueue, ^{
NSLog(@"任务1,当前线程:%@",[NSThread currentThread]);
});
dispatch_sync(myqueue, ^{
NSLog(@"任务2,当前线程:%@",[NSThread currentThread]);
});
运行结果如下:可以看出这些任务都被加到了main主线程中,这是所谓的多线程执行成为单一线程执行。
-- ::27.316 -GCD-sync[:] 当前线程:<NSThread: 0x7f8633d14370>{number = , name = main}
-- ::27.317 -GCD-sync[:] 任务1,当前线程:<NSThread: 0x7f8633d14370>{number = , name = main}
-- ::27.317 -GCD-sync[:] 任务2,当前线程:<NSThread: 0x7f8633d14370>{number = , name = main}
====================================================================
情况三:GCD-异步 GCD中向并行队列加同步任务,实际上都会加到新开辟的新线程中。
//当前主线程
NSLog(@"当前线程:%@",[NSThread currentThread]);
//获取一个全局的并行队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
//异步开启一个新的线程
dispatch_async(queue, ^{ //新线程
NSLog(@"新的线程:%@",[NSThread currentThread]); //在向新线程同步添加任务
dispatch_sync(queue, ^{
NSLog(@"任务3,当前线程:%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"任务4,当前线程:%@",[NSThread currentThread]);
});
});
运行结果如下:可以看出此时有两个线程,一个main主线程,一个没名字null的新线程。而这些任务都被加到了新的线程中,两个线程异步执行。
-- ::09.615 -GCD-sync[:] 当前线程:<NSThread: 0x7fcf43f0e750>{number = , name = main}
-- ::09.616 -GCD-sync[:] 新的线程:<NSThread: 0x7fcf43c426e0>{number = , name = (null)}
-- ::09.616 -GCD-sync[:] 任务3,当前线程:<NSThread: 0x7fcf43c426e0>{number = , name = (null)}
-- ::09.617 -GCD-sync[:] 任务4,当前线程:<NSThread: 0x7fcf43c426e0>{number = , name = (null)}
====================================================================
情况四:GCD-异步 GCD中向串行队列加同步任务,实际上都会加到新开辟的新线程中。
//当前主线程
NSLog(@"当前线程:%@",[NSThread currentThread]); // 创建一个自定义的串行队列
dispatch_queue_t myqueue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_CONCURRENT); //异步开启一个新的线程
dispatch_async(myqueue, ^{ //新线程
NSLog(@"新线程:%@",[NSThread currentThread]); //在向新线程同步添加任务
dispatch_sync(myqueue, ^{
NSLog(@"任务3,当前线程:%@",[NSThread currentThread]);
});
dispatch_sync(myqueue, ^{
NSLog(@"任务4,当前线程:%@",[NSThread currentThread]);
});
});
运行结果如下:情况一样,可以看出此时有两个线程,一个main主线程,一个没名字null的新线程。而这些任务都被加到了新的线程中,两个线程异步执行。
-- ::49.023 -GCD-sync[:] 当前线程:<NSThread: 0x7ffec3f07ca0>{number = , name = main}
-- ::49.024 -GCD-sync[:] 新线程:<NSThread: 0x7ffec3e18180>{number = , name = (null)}
-- ::49.024 -GCD-sync[:] 任务3,当前线程:<NSThread: 0x7ffec3e18180>{number = , name = (null)}
-- ::49.025 -GCD-sync[:] 任务4,当前线程:<NSThread: 0x7ffec3e18180>{number = , name = (null)}
iOS:对GCD中 同步、异步、并行、串行的见解的更多相关文章
- iOS:GCD理解1(同步-异步、串行-并行)
1.并行-异步(ST1与ST2抢占资源) 1-1).获取 并行(全局)队列 ,DISPATCH_QUEUE_PRIORITY_DEFAULT 为默认优先级. dispatch_queue_t queu ...
- 【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例
(1)GCD实现的同步异步.串行并行. --同步sync应用场景:用户登录,利用堵塞 --串行异步应用场景:下载等耗时间的任务 /** * 由于是异步.所以开通了子线程.可是由于是串行队列,所以仅仅须 ...
- GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例
转:http://www.tuicool.com/articles/NVVnMn (1)GCD实现的同步异步.串行并行. ——同步sync应用场景:用户登录,利用阻塞 ——串行异步应用场景:下载等耗时 ...
- 【原】iOS多线程之异步任务+并行队列情况与异步任务+串行队列(主队列)情况
异步任务+并行队列 把异步任务放到并行队列进行执行,异步任务会在不同的线程中执行. /*异步执行+并行队列*/ - (IBAction)clickBasic1:(UIButton *)sender { ...
- iOS GCD, 同步,异步,串行队列,并行队列,dispatch_group
同步,指代码在同一个线程运行 异步,代码在另一个线程运行 串行队列,提交到该队列的block会顺序执行 并行队列,提交到该队列的block会并发执行 如果想等某一队列中所有block都执行完了在执行一 ...
- ios--进程/多线程/同步任务/异步任务/串行队列/并行队列(对比分析)
现在先说两个基本的概念,啥是进程,啥是线程,啥又是多线程;先把这两个总是给弄清再讲下面的 进程:正在进行的程序,我们就叫它进程. 线程:线程就是进程中的一个独立的执行路径.这句话怎么理解呢! 一个程序 ...
- GCD,用同步/异步函数,创建并发/串行队列
队列 第一个参数:C语言字符串,标签 第二个参数: DISPATCH_QUEUE_CONCURRENT:并发队列 DISPATCH_QUEUE_SERIAL:串行队列 dispatch_queue_ ...
- Python并发编程系列之常用概念剖析:并行 串行 并发 同步 异步 阻塞 非阻塞 进程 线程 协程
1 引言 并发.并行.串行.同步.异步.阻塞.非阻塞.进程.线程.协程是并发编程中的常见概念,相似却也有却不尽相同,令人头痛,这一篇博文中我们来区分一下这些概念. 2 并发与并行 在解释并发与并行之前 ...
- iOS 关于GCD中的队列
GCD中队列分类及获得方式 1.串行队列 dispatch_queue_t queue = dispatch_queue_create("队列名", DISPATCH_QUEUE ...
随机推荐
- Java显式锁学习总结之一:概论
我们都知道在java中,当多个线程需要并发访问共享资源时需要使用同步,我们经常使用的同步方式就是synchronized关键字,事实上,在jdk1.5之前,只有synchronized一种同步方式.而 ...
- 【python】时间戳、字典列表排序
记录一下昨天学到的知识: 一.文件相关 文件追加:f = open("fname","a") 文件不存在时创建 二.时间戳相关 http://www.jb ...
- 深度学习方法:受限玻尔兹曼机RBM(一)基本概念
欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术.应用感兴趣的同学加入. 最近在复习经典机器学习算法的同 ...
- python写的的简单的爬虫小程序
import re import urllib def getHtml(url): page=urllib.urlopen(url) html=page.read() return html def ...
- yii2-admin扩展自定义目录
yii2-admin文件如下.仓库地址: https://github.com/mdmsoft/yii2-admin/tree/master 复制yii2-admin文件至自定义目录 比如我就复制到 ...
- PHP数组转对象,对象转数组
废话不多,直接上代码: <?php class object_array{ //数组转对象 public static function array_to_object($e){ if(gett ...
- git 命令小结
一.git 版本管理 1.git log: 获取当前版本之前的所有操作 2.git log --pretty=oneline:获取当前版本的前三和后三个操作 3.git reflog :获取当前项目下 ...
- ZUFEOJ 2147 07染色带谜题
2147: 07染色带谜题 时间限制: 1 Sec 内存限制: 128 MB提交: 170 解决: 21[提交][状态][讨论版][Edit] [TestData] 题目描述 现在给你一个长为N的 ...
- 文件包含漏洞检测工具fimap
文件包含漏洞检测工具fimap 在Web应用中,文件包含漏洞(FI)是常见的漏洞.根据包含的文件不同,它分为本地文件包含漏洞(LFI)和远程文件包含漏洞(RFL).利用该漏洞,安全人员可以获取服务 ...
- UML整体概括
UML (Unified Modeling Language)为面向对象软件设计提供统一的.标准的.可视化的建模语言.适用于描述以用例为驱动,以体系结构为中心的软件设计的全过程. UML的定义包括UM ...