多线程探索一-概念

2021-08-21  本文已影响0人  我只是个仙

本文属于多线程系列:
多线程探索一-概念
多线程探索二-GCD
多线程探索三-NSOperation
多线程探索四-锁

进程

进程是系统资源分配和调度的独立单元
进程是处于运行中的程序,是系统资源分配和调度的独立单位。
iOS中一个app就是一个单独的进程,进程之间通常是不允许互相访问的。
进程之间相互独立,一个进程崩溃不会影响其他进程。
进程切换,消耗资源,效率低

线程

线程是处理器调度的基本单元
线程是进程的基本执行单元,进程至少拥有一个线程即主线程。
一个进程可以拥有多个线程,线程之间可以共享当前进程下的所有数据资源和地址空间。
线程之间是独立运行的,一个线程是不知道其他线程的存在的。
一个线程崩溃则整个进程都死掉了。
线程切换代价小,效率高

任务和队列

任务就是执行代码, 执行任务分为两种 同步 和 异步,下面会讲到。
队列就是任务的等待队列,队列的特点是FIFO(先进先出),队列也分为两种 串行队列和并发队列 接下来会讲。
任务是你要执行的代码,队列是指按照FIFO原则存放你要执行的任务,而真正执行是靠线程来执行的。而所有的这些资源调度是靠进程来完成的。

同步和异步

这里同步和异步描述的是任务的执行方式:
同步任务:添加到队列的任务,要执行的任务会一直等到前面的任务执行完毕之后才开始,不具备开启新线程的能力,一般在当前线程中执行
异步任务:添加到队列的任务,不需要等待前面的任务,加入之后就可以开辟新的线程去执行当前任务。有开启新线程的能力,但是不一定会开启。

串行和并发

串行队列: 只会开启一个线程,每次只能执行一个任务。
并发队列: 可以开启多条线程,可以同时执行多个任务
iOS默认有两种队列:
- 主队列-串行队列
- 全局队列-并发队列
同步任务需要放在串行队列中才有效
异步任务配合并发队列才有效

iOS多线程对比

这里借用网上的两张图  
截屏2021-08-21 下午4.41.19.png

什么是死锁

GCD: 在一个串行队列的任务中,再向这个队列同步添加任务。

如下例子:
    - (void)viewDidLoad {
        [super viewDidLoad];
        NSLog(@"2");
        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"串行队列中的同步任务");
        });
        NSLog(@"2");
    }

欢迎访问我的博客 传送门

参考文档:

iOS多线程实现方案对比

上一篇下一篇

猜你喜欢

热点阅读