本篇首先来学习 iOS 多线程技术中的 Pthreads 和 NSThread。⛽️⛽️
Pthreads
可移植操作系统接口(英语:Portable Operating System Interface,缩写为POSIX)是 IEEE(电气和电子工程师协会)为要在各种 UNIX 操作系统上运行软件,而定义 API 的一系列互相关联的标准的总称,其正式称呼为 IEEE Std 1003,而国际标准名称为 ISO/IEC 9945。此标准源于一个大约开始于1985 年的项目。POSIX 这个名称是由理查德·斯托曼(RMS)应 IEEE 的要求而提议的一个易于记忆的名称。它基本上是 Portable Operating System Interface(可移植操作系统接口)的缩写,而 X 则表明其对 Unix API 的传承。–来自百度百科。
Pthreads 一般指 POSIX 线程。 POSIX 线程(POSIX Threads,常被缩写为 Pthreads)是 POSIX 的线程标准,定义了创建和操纵线程的一套 API。
Pthreads 简介
实现 POSIX 线程标准的库常被称作 Pthreads,一般用于 Unix-like POSIX 系统,如 Linux、Solaris、macOS。但是 Microsoft Windows 上的实现也存在,例如直接使用 Windows API 实现的第三方库 pthreads-w32,而利用 Windows 的 SFU/SUA 子系统,则可以使用微软提供的一部分原生 POSIX API。Pthreads 是一套通用的多线程的 API,可以在 Unix / Linux / Windows 等系统跨平台使用,使用 C 语言编写,需要程序员自己管理线程的生命周期,这里我们对它常用的 API 学习一下,等到后面学习 GCD 源码的时候都会用到。
Pthreads 定义了一套 C 语言的类型、函数与常量,它以 pthread.h 头文件和一个线程库实现。Pthreads API 中大致共有 100 个函数调用,全都以 “pthread_” 开头,并可以分为四类:(这里我们只关注第一类:线程管理,其它三类关于锁的部分可以参考前面锁的文章)
- 线程管理,例如创建线程,等待(join)线程,查询线程状态等。
- 互斥锁(Mutex):创建、摧毁、锁定、解锁、设置属性等操作。
- 条件变量(Condition Variable):创建、摧毁、等待、通知、设置与查询属性等操作。
- 使用了互斥锁的线程间的同步管理
Pthreads 使用
在 iOS 中使用 Pthreads API 首先要引入头文件: #import <pthread.h>
。我们先看一个最简单的开启线程的例子:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
// 定义一个 pthread_t 类型变量,为指向线程的指针,
// 它实际类型是 struct _opaque_pthread_t 指针。
pthread_t thread = NULL;
// 用于在主线程内接收子线程任务执行完成后的返回值。(如果没有返回值则可忽略)
void* thread_ret = NULL;
// 准备一个变量用于传递参数
NSObject *objc = [[NSObject alloc] init];
NSLog(@"objc: %p", objc);
// (__bridge void *):在 C 和 OC 之间传递数据,需要使用 __bridge 进行桥接,桥接的目的就是为了告诉编译器如何管理内存。
// 也可使用 CFBridgingRetain:pthread_create(&thread, NULL, run, (void *)CFBridgingRetain(objc))
// 但是后要跟 CFBridgingRelease((__bridge void *)objc),要不然会导致 objc 内存泄漏。
// 直接传递 objc 会提示如下错误,并给了我们两种解决方法:
// Implicit conversion of Objective-C pointer type 'NSObject *' to C pointer type 'void *' requires a bridged cast
// Use __bridge to convert directly (no change in ownership)
// Use CFBridgingRetain call to make an ARC object available as a +1 'void *'
// MRC 中不需要使用桥接,能直接使用 objc
int result = pthread_create(&thread, NULL, run, (__bridge void *)(objc));
if (result == 0) {
NSLog(@"创建线程成功
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)