iOS:多线程(一) —— pthread

it2022-05-05  104

前言

在日常开发中,多线程的使用能帮助我们解决很多问题,比如大量数据的运算,复杂程序的执行,以及利用锁来实现一些需求,本系列文章主要介绍 iOS 中多线程实现技术的用法。

多线程 一个进程中可以开启多条线程,每条线程可以并行执行不同的任务,以充分利用资源,提高运算效率。

多线程原理 同一时间,CPU 只能处理 1 条线程,只有 1 条线程在执行,多线程并发执行,其实是 CPU 快速地在多条线程之间调度(切换),如果 CPU 调度线程的时间足够快,就造成了多线程并发执行的假象,并不是 CPU 在同一时刻同时执行多个任务。

优点 能适当提高程序的执行效率; 能适当提高资源利用率(CPU、内存利用率)。

缺点 开启线程需要占用一定的内存空间(默认情况下,主线程占用1M,子线程占用512KB),如果开启大量的线程,会占用大量的内存空间,降低程序的性能; 线程越多,CPU 在调度线程上的开销就越大。

在 iOS 中,多线程解决方案主要有以下四种:

iOS:多线程(二) —— NSThread

这篇文章我们先来介绍 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


最新回复(0)