iOS 多线程知识总结 GCD基础知识
进程的基本概念:
1.每一个进程都是一个一个应用程序,都有独立的内存空间,一般来说一个应用程序存在一个进程存在一个进程,但也有多个进程的情况。
2.同一个进程中的线程共享内存中内存中资源。
多线程的基本概念:
1.每一个程序都有一个主线程,程序启动时创建(调用main函数来启动)
2.主线程的生命周期是和其他应用程序绑定的,程序退出时,主线程也就停止了。
3.多线程技术表示,一个应用程序有多个线程,使用多线程能提高CPU的使用效率,防止线程阻塞
4.任何有可能阻塞主线程的任务不要在主线程中执行(例如访问网络)
线程使用不是无节制的:
1.iOS中的主线程的堆栈大小是1M
2.从第二个线程开始都是512KB
3.以上这些数值不能通过编译器开关或者线程api函数更改
只有主线程有直接修改UI的能力。
iOS的三种多线程技术:
1.NSThread每个NSThread对象对应一个线程,轻量级。
2NSOperation/NSOperationQueue面向对象的线程技术。
3.GCD——Grand Central Dispatch 是基于C语言的框架,可以充分利用多核,也是苹果官方推荐使用的多线程技术。
三种多线程技术的对比:
1.NSThread:优点:NSThread比其他俩个轻量级,使用简单。
缺点:需要自己管理线程的生命周期、线程同步、加锁、睡眠以及唤醒等。线程同步对数据的加锁会有一定的系统开销
2.NSOpertion:不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上。NSOpertion是面向对象的。
3.GCD:GCD是由苹果开发的一个多核编程的解决方案。iOS4.0+才能使用,是替代NSThread,NSOperation的高效和强大的技术,GCD是基于C语言的
GCD是苹果公司为多核的并行运算提出的解决方案
GCD会自动利用更多的CPU内核(比如双核、四核)
GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)
程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码
GCD中有两个核心概念:
(1)任务:执行什么操作
(2)队列:存放任务
队列:
1.串行队列:添加到队列中的任务是一个一个执行的
2.并行(发)队列:添加到队列中的任务是多个同时执行的
3.主队列:里面的任务都是在主线程执行的,可以理解为主队列就是串行队列的一种
4.全局队列:并行(发)队列
同步、异步:
1、同步:需要后面的任务等待,不会开启新的线程,会直接使用当前的线程
2、异步:不需要后面的任务等待,会开启新的线程
(1)用同步的方式执行任务 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
参数说明:
queue:队列
block:任务
(2)用异步的方式执行任务 dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
3.同步和异步的区别
同步:在当前线程中执行
异步:在另一条线程中执行
说明:
同步函数不具备开启线程的能力,无论是什么队列都不会开启线程;异步函数具备开启线程的能力,开启几条线程由队列决定(串行队列只会开启一条新的线程,并发队列会开启多条线程)。
同步函数
(1)并发队列:不会开线程
(2)串行队列:不会开线程
异步函数
(1)并发队列:能开启N条线程
(2)串行队列:开启1条线程
凡是函数中,各种函数名中带有create\copy\new\retain等字眼,都需要在不需要使用这个数据的时候进行release。
GCD的数据类型在ARC的环境下不需要再做release。
CF(core Foundation)的数据类型在ARC环境下还是需要做release。
异步函数具备开线程的能力,但不一定会开线程