基本概念
进程
在系统中运行的一个应用程序,每个进程都是独立的,每个进程都运行在其专用且受保护的内存空间内。
线程
一个进程 (程序) 的所有任务都在线程内进行,每个进程至少拥有一个线程 (主线程)。
多线程
多线程是指在一个进程中开启多条线程,多条线程可以并行执行不同的任务,多条线程并发执行的本质是CPU在多条线程之间不断地调度。
主线程
在一个ios程序运行后,会默认开启一条线程,称为“主线程”或“UI进程”,用于处理UI事件和显示、刷新UI。
实现方法
pthread
- 使用C语言。
- 跨平台\可移植。
- 有一套通用的API。
- 其生命周期由程序员管理。
- 适用于Unix\Linux\Windows等系统。
- 使用难度大,几乎不使用。
NSThread
- 使用OC语言。
- 更加面向对象。
- 生命周期由程序员管理。
- 简单易用,可以对线程对象直接操作,偶尔使用。
GCD
- 使用C语言。
- 旨在替代NSThread等线程技术。
- 充分利用设备多核。
- 生命周期由系统管理,经常使用。
NSOperation
- 基于GCD,使用OC语言
- 比GCD多了一些简易的功能。
- 使用更加面向对象。
- 生命周期由系统管理,经常使用。
多线程的优缺点
优点
- 能够适当提高程序执行效率。
- 能够适当提高系统资源利用率。
- 线程上的任务完成后,线程会自动销毁。
缺点
- 开启线程需要占用一定的内存空间,线程开启过多会导致程序性能降低。
- 线程开启越多,CPU在调用线程上的开销越大。
- 让程序设计更加复杂。
pthread
使用pthread需要先导入头文件。
#import <pthread/pthread.h>
// 导入 pthread 头文件
使用pthread创建新线程的函数是:
pthread_create(<#pthread_t _Nullable *restrict _Nonnull#>, //线程编号的地址
<#const pthread_attr_t *restrict _Nullable#>, //线程的属性
<#void * _Nullable (* _Nonnull)(void * _Nullable)#>, //线程要执行的函数
<#void *restrict _Nullable#> ) //执行函数的参数
该函数返回值类型为int,成功时函数返回值为 1 ,失败返回 0 。
线程编号通过pthread_t pthread;的方式创建。
eg.
#import "ViewController.h"
#import <pthread/pthread.h> //引入头文件
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
pthread_t pthread; //创建线程编号
int result = pthread_create(&pthread,NULL, pthreadFunction, NULL);
if (result)
NSLog(@"success");
else
NSLog(@"fail");
}
void *pthreadFunction(void *param){
NSLog(@"pthread");
return NULL;
}