前言
在日常开发中,多线程的使用能帮助我们解决很多问题,比如大量数据的运算,复杂程序的执行,以及利用锁来实现一些需求,本系列文章主要介绍 iOS 中多线程实现技术的用法。
-
多线程
一个进程中可以开启多条线程,每条线程可以并行执行不同的任务,以充分利用资源,提高运算效率。 -
多线程原理
同一时间,CPU 只能处理 1 条线程,只有 1 条线程在执行,多线程并发执行,其实是 CPU 快速地在多条线程之间调度(切换),如果 CPU 调度线程的时间足够快,就造成了多线程并发执行的假象,并不是 CPU 在同一时刻同时执行多个任务。 -
优点
能适当提高程序的执行效率;
能适当提高资源利用率(CPU、内存利用率)。 -
缺点
开启线程需要占用一定的内存空间(默认情况下,主线程占用1M,子线程占用512KB),如果开启大量的线程,会占用大量的内存空间,降低程序的性能;
线程越多,CPU 在调度线程上的开销就越大。
在 iOS 中,多线程解决方案主要有以下四种:
多线程解决方案这篇文章我们先来介绍 pthread
pthread 简介
pthread 是一套通用的多线程的 API,可以在Unix / Linux / Windows 等系统跨平台使用,使用 C 语言编写,需要程序员自己管理线程的生命周期,使用难度较大。
pthread 简单使用
NSLog(@"%s : %@", __func__, [NSThread currentThread]);
/************************** 创建线程 *************************/
// pthread
pthread_t thread = NULL;
NSString *paramStr = @"paramStr";
// 可接收返回值判断线程有没有创建成功 0 成功 !0 失败
int res = pthread_create(&thread, // 线程对象,传递地址
NULL, // 线程属性,可设置为null
pthreadMethod, // 指向函数的指针
(__bridge void *)(paramStr)); // 函数需要接受的参数,可为null
if (res == 0) {
NSLog(@"线程创建成功!pthread begin");
}
// 设置子线程的状态为 detached, 则该线程运行结束后会自动释放所有资源,或者在子线程中添加 pthread_detach(pthread_self()),其中 pthread_self() 是获得线程自身的 id
pthread_detach(thread);
NSLog(@"pthread end");
// pthread执行方法
void *pthreadMethod(void *parma) {
for (NSInteger i = 0; i < 5; i++) {
NSLog(@"%ld --> %s : %@ param: %@", i, __func__, [NSThread currentThread], (__bridge NSString *)(parma));
[NSThread sleepForTimeInterval:1.0]; // 模拟耗时
}
return NULL;
}
pthread_create()
就是创建线程的方法,只需填写四个参数,就可以创建线程,我们来看一下输出
pthreadMethod()
的方法是在子线程执行,而主线程的输出先于子线程执行,说明子线程的耗时任务不会影响主线程的执行逻辑。
pthread 其他方法及参数
pthread_t
: 线程ID
pthread_attr_t
: 线程属性
pthread_create()
: 创建一个线程
pthread_exit()
: 终止当前线程
pthread_cancel()
: 中断另外一个线程的运行
pthread_join()
: 阻塞当前的线程,直到另外一个线程运行结束
pthread_attr_init()
: 初始化线程的属性
pthread_attr_setdetachstate()
: 设置脱离状态的属性
pthread_attr_getdetachstate()
: 获取脱离状态的属性
pthread_attr_destroy()
: 删除线程的属性
pthread_kill()
: 向线程发送一个信号
pthread_equal()
: 对两个线程的线程标识号进行比较
pthread_detach()
: 分离线程
pthread_self()
: 查询线程自身线程标识号
以上是关于 pthread
的介绍和简单使用的说明,相关 demo 请参考
https://github.com/G-Jayson/Multi-thread
网友评论