OC底层原理19 - 多线程基本概念

2021-04-01  本文已影响0人  卡布奇诺_95d2

线程与进程

线程与进程概念

进程与线程的关系

  1. 进程与线程是包含与被包含的关系,即:进程中包含多个线程
  2. 同一个进程中的线程共享进程的地址空间和资源
  3. 多进程比多线程健壮。即一个进程崩溃之后一般情况下不会对其它进程产生影响,但是一个线程崩溃了,那整个进程都无法继续了。
  4. CPU调度的基本单位是线程
  5. 各进程进行切换时,会消耗一定的资源,如果频繁切换进程,效率较低下。
  6. 线程不能独立执行,必须依存于应用程序中。

线程和Runloop的关系

  1. runloop与线程是一一对应的,一个runloop对应一个线程。
  2. runloop是来管理线程的,当线程的runloop被开启后,线程会在执行完任务后进入休眠状态,有了任务就会被唤醒去执行任务。
  3. runloop在第一次获取时被创建,在线程结束时被销毁
  4. 对于主线程来说,runloop在程序一启动就默认创建好了
  5. 对于子线程来说,runloop是懒加载的,只有当我们使用的时候才会创建,所以在子线程用定时器要注意:确保子线程的runloop被创建,不然定时器不会回调

多线程原理

多线程原理

对于单核CPU,同一时间,CPU只能处理一条线程,即只有一条线程在工作,这种情况下的多线程的本质是CPU在多个任务之间进行快速的切换,由于CPU调度线程的时间足够快,就造成了多线程的“同时”执行的效果。其中切换的时间间隔就是时间片。
对于多核CPU,同一个时间,CPU可以处理多条线程。

多线程意义

优点:

缺点:

多线程生命周期

多线程的生命周期有5个状态:

多线程生命周期.png

线程池原理

线程池原理.png

iOS中多线程的实现方案

方案 简介 语言 线程生命周期 使用频率
pthread 1、一套能用的多线程API;
2、适用于Linux、Unix、Windows等系统;
3、跨平台、可移植;
4、使用难度较大
C 程序员管理 几乎不用
NSThread 1、使用更加面向对象;
2、使用较为简单,可直接操作线程对象;
OC 程序员管理 偶尔使用
GCD 1、替代NSThread等线程技术;
2、充分利用设备的多核;
C 自动管理 经常使用
NSOperation 1、基于GCD封装;
2、比GCD多了一些更加简单实用的功能;
3、使用更加面向对象;
OC 自动管理 经常使用

在iOS的多线程使用过程中,存在C和OC的桥接,则需要注意的点如下:

线程安全问题

当多个线程同时访问同一块资源时,容易引发数据错乱和数据安全问题,目前主要有以下两种解决方案

互斥锁

作用:确保同一时间,只有一条线程能够执行

自旋锁

自旋锁与互斥锁类似,但它不是通过休眠使线程阻塞,而是在获取锁之前一直处于忙等(即原地打转,称为自旋)阻塞状态。

使用场景:锁持有的时间短,且线程不希望在重新调度上花太多成本时,就需要使用自旋锁,属性修饰符atomic,就有一把自旋锁。

加入了自旋锁,当新线程访问代码时,如果发现有其他线程正在锁定代码,新线程会一直等待锁定的代码执行完成,即不停的尝试执行代码,比较消耗性能。

atomic 原子锁 & nonatomic 非原子锁

atomicnonatomic主要用于属性的修饰。

上一篇 下一篇

猜你喜欢

热点阅读