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提供函数实现多线程开发 ...
随机推荐
- HTML入门基础教程相关知识
HTML入门基础教程 html是什么,什么是html通俗解答: html是hypertext markup language的缩写,即超文本标记语言.html是用于创建可从一个平台移植到另一平台的超文 ...
- jQuery基础知识— 获得内容和属性
jQuery拥有可操作HTML元素和属性的方法. 获得内容: text()--设置或返回所选元素的文本内容 html()--设置或返回所选元素的内容(包括HTML标记) val()--设置或返回表 ...
- SharePoint 2010 自定义 字段 类型--------省市区联动
转:http://www.cnblogs.com/sp007/p/3384310.html 最近有几个朋友问到了有关自定义字段类型的问题,为了让更多的人了解自定义字段类型的方法,特写一篇博客与大家分享 ...
- Spring 教程(一)
一.Spring是什么 通常说的Spring其实指的是Spring Framework,它是Spring下的一个子项目,Spring围绕Spring Framework这个核心项目开发了大量其他项目, ...
- ArcGIS.Server.9.3和ArcGIS API for JavaScript地图实现Toorbar功能(四)
转自:http://www.cnblogs.com/hll2008/archive/2008/11/22/1338630.html 目的:1.ArcGIS API for JavaScript实现To ...
- Apache log4cxx用法
一个好的系统通常需要日志输出帮助定位问题 .Apache基金会的log4cxx提供的完善的Log分级和输出功能.所以准备把该Log模块加入的系统中. 使用log4cxx需要满足一下功能: 1.提供日志 ...
- ios游戏开发--cocos2d学习(3)
------------继续上一节的内容. “接收触摸事件”: CCLayer类是用来接收触摸输入的.不过你要首先启用这个功能才可以使用它. self.isTouchEnabled = YES;//此 ...
- js基础第七天
短信发送验证倒计时案例(常用) 关闭定时器clearInterval this 指向的是 事件的调用者 ,或者是函数的使用者. button 不可以用 disabled 不可用的意思 意思是变成灰色不 ...
- PHP编码规范整理,很全很实用(图文版)
有一个组织叫做“php互操作性框架制定小组”,这个小组的主要目的是制定各种PHP编码规范的,下面就是我根据小组提供的建议整理的一些常用的编码规范. PSR-1: 1.PHP代码文件必须以<?ph ...
- 怎样让你的代码更好的被JVM JIT Inlining
好书推荐:Effective Java中文版(第2版) JVM JIT编译器优化技术有近100中,其中最最重要的方式就是内联(inlining).方法内联可以省掉方法栈帧的创建,方法内联还使让JIT编 ...