GCD多线程
GCD本质线程自动管理指令包
GCD优点:
1.GCD 本身自带有线程锁的效果,能通过推迟昂贵计算任务并在后台运行它们来改善应用的响应性能。
2.GCD 提供了更易于使用的并发模型(效果方面类似于对锁和线程进行封包,程序员使用的过程中本身可以不直接接触锁和线程)避开并发陷阱(锁和线程的相关陷阱)。
3.GCD 具有在常见模式(如单例,mvc)上采用更高性能的原语(封包后只需要考虑出入接口问题)优化代码的能力。
函数指令与相应的任务:
函数指令是一系列的代码指令的集合,可以为计算机平台识别的指令的集合。
计算机的相关平台在接收到函数指令之后,平台将会作出一系列的应对措施既执行一系列的应对操作行为(任务)。从本质方面而言,指令为因任务为果。
Serial vs. Concurrent 串行 vs. 并发
共同点:描述当前任务相对于其它任务被执行状态。(都强调任务)
差异:串行是逐个逐个,每次有且仅有一个任务被执行。并发是在同一时间可以有多个任务被执行。
Synchronous vs. Asynchronous 同步 vs. 异步
共同点:描述当前的函数指令相对于其相应任务(指令函数要求 GCD 执行的任务)的状态。同步函数可以视为异步函数的一种特殊情况。同步异步研究的内容是函数指令与其相应任务间的关系(同一个当前线程下的研究)。
差异:
同步:只在指令函数预定的任务已经完成后,计算机才返回指令函数入口(出口)处,进入下一个指令重复。同步条件下任务只能逐个执行,故同步必串行,同步并发无意义。
异步:无论预定的任务当前是否已经完成,计算机都会由当前立即返回指令函数入口(出口)处,进入下一个指令重复。也就是说预定的任务最终肯定会完成但计算机不会等着它完成而是立即返回指令函数入口(出口)处。异步函数(指令)不会阻塞当前线程去执行下一个函数(指令),同步函数(指令)会阻塞当前线程去执行下一个函数(指令)。
同步函数为当前线程下的阻塞函数。
Critical Section 临界区
同一段代码不能被多个线程并发执行,也就是,多个线程不能同时执行某段代码。因为代码去操作一个共享资源,例如一个共享变量资源若共享的变量资源被多个进程/线程并发访问,那么它很可能会变质(它的值不再可信)。
Race Condition 竞态条件
基于特定序列或时机的事件的软件系统以不受控制的方式运行的行为。如程序的并发任务执行的确切顺序即为一种静态条件。竞态条件可导致无法预测的行为,而不能通过代码检查立即发现。
Deadlock 死锁
第一个线程指令的执行以第二个线程指令的完成作为前提同时第二个线程指令的执行又以第一个线程指令的完成作为前提;两个线程指令互相等待着对方先完成,两个线程指令都处于互相等待的状态,结果导致彼此都未能够执行,两个线程指令处于相互卡死状态(死锁)。故死锁状态下程序不在执行下去。
Thread Safe 线程安全
具有线程安全性的代码能在多线程或并发任务中被安全的调用,而不会导致数据损坏,崩溃等问题。线程不安全的代码在某一个/同一个时刻只能在一个线程上下文中运行。 NSDictionary代码是线程安全代码,所以在同一时间在多个线程中使用它而不会有问题。NSMutableDictionary代码属于线程非安全代码,同一时刻只能有一个线程访问代码。
Context Switch (线程之间)上下文切换(额外的开销)
(线程之间)上下文切换指当你在单个进程里对不同的线程进行切换执行期间(由一个线程切换为另一个线程期间)存储与恢复执行状态的过程。
Concurrency vs Parallelism 单核并发与多核并行
单核cpu处理器下,并发代码的各个部分采用抢占cpu资源的方式在纳米级时间段内进行线程间并发代码的切换,此时线程间的并发代码是否发生或怎样的顺序发生无法确定。
对于多核cpu设备而言,多个线程上的代码以并行方式运行,既每一个线程都可以单独获取一个独立的cpu独立运行,不需要不断的相互切换线程。若为了使单核cpu设备也能实现并行,必须先运行一个线程,执行一个线程上下文切换,上下文切换之后再运行另一个线程或进程。
并行可以视为并发的特殊情况,并行要求并发,但并发并不能保证并行。并发为必要不充分的代码构造条件。
Queues 队列(FIFO)
GCD可用dispatch queues处理任务代码块block,调度队列管理着提供给GCD的代码块block任务并才用 FIFO队列顺序执行这些block任务。第一个被添加到队列里的任务会是队列中第一个开始的任务,而第二个被添加的任务将第二个开始,如此直到队列的终点。(调度队列本身属于一种管理代码(管理代码也是代码)且为线程安全代码可从多个线程并行的访问。)
Serial Queues 调度串行队列还是Concurrent Queues 调度并发队列都遵循FIFO先进先出先执行,后进后出后执行的原则,区别在于怎样的状态下的后执行。
调度串行队列中一次只能够执行一个任务,既后一个模块任务被执行的前提条件必须为前一个模块任务已经完成且前一个Block任务结束时间点和后一个模块任务开始时间点之间的过渡时间段长度不确定(受到 GCD 的控制)。调度串行队列中每一个模块任务的执行时机受到 GCD 的控制进而不可确定;唯一能确保的事情是 在调度串行队列GCD一次只执行一个任务,并且按照FIFO顺序来执行。
在GCD环境下,需要新增的子线程(数目)不需要程序员本身亲自生成而是由系统后台按需要自动生成并分配。由于GCD串行队列中同一时间只会执行一个模块任务也就只会生成一个子线程(一个子线程执行一个代码模块任务),不会出现同时访问临界区的风险;如果访问临界区的唯一方式是通过提交到调度串行队列的任务,那么不需要担心临界区的安全问题了。
Concurrent Queues 调度并发队列(纳米级误差有序执行)
并发队列中任务的开始执行是FIFO有序的而任务的完成顺序则是任意的;不会知道何时开始运行下一个任务,或者任意时刻有多少 Block 在运行。
何时开始一个 Block 完全取决于 GCD 。如果一个 Block 的执行时间与另一个重叠,也是由 GCD 来决定是否将其运行在另一个不同的核心上,如果那个核心可用,否则就用上下文切换的方式来执行不同的 Block 。
Queue Types 队列类型(2大类6小种)
1)并发队列(全局调度队列)(Global Dispatch Queues):background、low、default和high优先级。Apple的API也使用这些全局调度队列,所以这些队列中实际管理的任务既有应用代码指令任务也有平台支持指令包中支持指令任务。
2)串行队列:普通串行队列和特殊串行队列既主队列(每次/同一时刻只能够执行一个任务)。
注:主队列中所有的模块任务都只能由主线程执行,不存在危险临界区问题。同时,主线程是唯一可用于更新 UI的线程。主队列中的代码块一般为刷新ui指令,这个队列就是向UIView发生消息或发送通知。
3)6种队列:主队列,4个全局调度队列,自建队列
原文链接:http://www.jianshu.com/p/20b59701b951
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
GCD多线程的更多相关文章
- iOS开发——GCD多线程详解
GCD多线程详解 1. 什么是GCD Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,简单来说,GCD就是iOS一套解决多线程的机制,使用GCD能够最大限度简化多线程 ...
- GCD多线程的一个全面的题目
GCD多线程的一个全面的题目
- [Xcode 实际操作]八、网络与多线程-(22)使用GCD多线程技术异步下载图片
目录:[Swift]Xcode实际操作 本文将演示如何使用使用GCD多线程技术异步下载图片. Grand Central Dispatch(GCD) 是 Apple 开发的一个多核编程的较新的解决方法 ...
- Object-C关于GCD多线程的使用
```objc1 使用Crearte函数创建的并发队列和全局并发队列的主要区别: 1)全局并发队列在整个应用程序中本身是默认存在的并且对应有高优先级.默认优先级.低优先级和后台优先级一共四个并发队列, ...
- iOS开发——多线程篇——NSOperation(基于GCD多线程编程),下载图片并合成新图片
一.NSOperation的基本概念1.简介NSOperation的作用配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperatio ...
- GCD 多线程 初探
GCD编程的核心就是dispatch队列,dispatch block的执行最终都会放进某个队列中去进行,它类似NSOperationQueue但更复杂也更强大,并且可以嵌套使用.所以说,结合bloc ...
- ios 使用GCD 多线程 教程
什么是GCD Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法.该方法在Mac OS X 10.6雪豹中首次推出,并随后被引入到了iOS4.0中.GCD ...
- ios开发:GCD多线程
ios有三种多线程编程技术,分别是NSThread,Cocoa NSOperation和GCD,GCD全称Grand Central Dispatch 是Apple开发的一个多核编程的解决方法,在iO ...
- iOS——GCD多线程
1> 概述 Grand Central Dispatch (GCD)是Apple开发的一种多核编程技术.主要用于优化应用程序以支持多核处理器以及其他对称多处理系统. GCD提供函数实现多线程开发 ...
随机推荐
- (十二)学习CSS之display属性
参考:http://www.w3school.com.cn/cssref/pr_class_display.asp 浏览器支持 所有主流浏览器都支持 display 属性. 注释:如果规定了 !DOC ...
- Hibernate之HQL介绍
Hibernate中提供了多种检索对象的方式,主要包括以下种类: 导航对象图检索方式:根据已经加载的对象导航到其他对象 OID检索方式:根据对象的OID来检索对象 HQL检索方式:使用面向对象的HQL ...
- Sql2005 全文索引详解
1.前言 14.1 全文索引的介绍 14.2 全文索引中常用的术语 14.3 全文索引的体系结构 14.4 全文目录管理 14.4.1 创建全文目录 14.4.2 查看与修改全文目录 14 ...
- OWASP Top 10 – 2013, 最新十大安全隐患(ASP.NET解决方法)
OWASP(开放Web软体安全项目- Open Web Application Security Project)是一个开放社群.非营利性组织,目前全球有130个分会近万名会员,其主要目标是研议协助解 ...
- 单元测试之获取Spring下所有Bean
单元测试中,针对接口的测试是必须的,但是如何非常方便的获取Spring注册的Bean呢? 如果可以获取所有的Bean,这样就可以将这个方法放到基类中,方便后面所有单元测试类的使用,具体实现如下: im ...
- LWIP互联网资料汇总
本文主要搜集了下互联网上关于LWIP的资料和教程 欢迎补充 第一部分:移植 LWIP在UCOS上移植 LWIP 在STM32上移植 http://www.docin.com/p-459242028 ...
- [原]AngularJS iframe打开不同域的内容时报错误
<iframe id="myFrame" ng-src="{{url}}" width="100%" height="100 ...
- Spring MVC @ModelAttribute
1.@ModelAttribute注释void返回值的方法 @Controller public class HelloModelController { @ModelAttribute public ...
- HDU-4612 Warm up 边双连通分量+缩点+最长链
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4612 简单图论题,先求图的边双连通分量,注意,此题有重边(admin还逗比的说没有重边),在用targ ...
- hdu4587-TWO NODES(割点)
#include <bits/stdc++.h> using namespace std; ; ; struct Edge { int to, next; } edge[M]; int h ...