iOS多线程知识总结

时间:2022-04-23 05:15:06
进程的基本概念:
     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。 
异步函数具备开线程的能力,但不一定会开线程