iOS多线程笔记(GCD理解)
0x00 先上脑图
0x01 iOS的三种多线程技术
1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程)
2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题
NSOperation/NSOperationQueue 面向对象的线程技术
GCD —— Grand Central Dispatch(派发) 是基于C语言的框架,可以充分利用多核,是苹果推荐使用的多线程技术
以上这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Apple最推荐使用的,在项目中很多框架技术分别使用了不同多线程技术
0x02 三种多线程技术的对比
NSThread:
–优点:NSThread 比其他两个轻量级,使用简单
–缺点:需要自己管理线程的生命周期、线程同步、加锁、睡眠以及唤醒等。线程同步对数据的加锁会有一定的系统开销
NSOperation:
–不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上
–NSOperation是面向对象的
GCD:
–Grand Central Dispatch是由苹果开发的一个多核编程的解决方案。iOS4.0+才能使用,是替代NSThread, NSOperation的高效和强大的技术
–GCD是基于C语言的
0x03 什么是GCD?
Grand Central Dispatch或者GCD,是一套低层API,提供了一种新的方法来进行并发程序编写。从基本功能上讲,GCD有点像NSOperationQueue,他们都允许程序将任务切分为多个单一任务然后提交至工作队列来并发地或者串行地执行。GCD比之NSOpertionQueue更底层更高效,并且它不是Cocoa框架的一部分。
优势:
易用: GCD比之thread跟简单易用
性能: GCD自动根据系统负载来增减线程数量,这就减少了上下文切换以及增加了计算效率
0x04 Dispatch Queues
GCD的基本概念就是dispatch queue。dispatch queue是一个对象,它可以接受任务,并将任务以先到先执行的顺序来执行。dispatch queue可以是并发的或串行的。并发任务会像NSOperationQueue那样基于系统负载来合适地并发进行,串行队列同一时间只执行单一任务。
GCD中有三种队列类型:
Main queue: 与主线程功能相同。实际上,提交至main queue的任务会在主线程中执行;
Global queues: 全局队列是并发队列,并由整个进程共享。进程中存在三个全局队列:高、中(默认)、低三个优先级队列;
Serial queue:用函数 dispatch_queue_create 创建的队列. 串行
0x05 自己的理解
1、Serial queue是自己唯一可以创建并管理,Main queue和Global queues都只能Get,系统给用的不用自己管理;
2、dispatch队列是线程安全的,可以利用串行队列实现锁的功能。比如多线程写同一数据库,需要保持写入的顺序和每次写入的完整性,简单地利用串行队列即可实现;
3、Global queues这个全局并发队列,自动根据系统负载来增减线程数量,这就减少了上下文切换以及增加了计算效率;
4、Main queue 把它留个UI操作。