首页 > 代码库 > iOS开发 - 多线程实现方案之Pthread篇

iOS开发 - 多线程实现方案之Pthread篇

pthread基础

pthread是POSIX thread的简写,一套通用的多线程API,适用于Unix、Linux、Windows等系统,跨平台、可移植,使用难度大,C语言框架,线程生命周期由程序员管理,百度百科上有详细的介绍,去查看,由于iOS开发几乎用不到,以下就简单运用pthread开启一个子线程,用来处理耗时操作

pthread创建子线程步骤

1.导入头文件

#import <pthread.h>

2.pthread创建子线程

- (void)viewDidLoad {
    [super viewDidLoad];
    
    /**
     说明:
     1.在c语言中,没有对象的概念,对象类型是以-t/Ref结尾的;
     2.c语言中的void * 和OC的id是等价的;
     3.在混合开发时,如果在 C 和 OC 之间传递数据,需要使用 __bridge 进行桥接,桥接的目的就是为了告诉编译器如何管理内存,MRC 中不需要使用桥接;
     4.在 OC 中,如果是 ARC 开发,编译器会在编译时,根据代码结构, 自动添加 retain/release/autorelease。但是,ARC 只负责管理 OC 部分的内存管理,而不负责 C 语言 代码的内存管理。因此,开发过程中,如果使用的 C 语言框架出现retain/create/copy/new 等字样的函数,大多都需要 release,否则会出现内存泄漏
     */
    
    //1.创建线程对象
    pthread_t thread;
    
    //2.创建线程
    NSString *param = @"参数";
    int result = pthread_create(&thread, NULL, task, (__bridge void *)(param));
    result == 0?NSLog(@"success"):NSLog(@"failure");
    
    //3.设置子线程的状态设置为detached,则该线程运行结束后会自动释放所有资源,或者在子线程中添加 pthread_detach(pthread_self()),其中pthread_self()是获得线程自身的id
    pthread_detach(thread);
    
    /**
    pthread_create(<#pthread_t  _Nullable *restrict _Nonnull#>, <#const pthread_attr_t *restrict _Nullable#>, <#void * _Nullable (* _Nonnull)(void * _Nullable)#>, <#void *restrict _Nullable#>)
     参数:
     1.指向线程标识符的指针,C 语言中类型的结尾通常 _t/Ref,而且不需要使用 *;
     2.用来设置线程属性;
     3.指向函数的指针,传入函数名(函数的地址),线程要执行的函数/任务;
     4.运行函数的参数;
     */

}

/**
 void *    (*)   (void *)
 返回值    函数名  函数参数
 */
void *task(void * param){
    
    //在此做耗时操作
    NSLog(@"new thread : %@  参数是: %@",[NSThread currentThread],(__bridge NSString *)(param));
    
    return NULL;
}

其他相关函数

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(): 查询线程自身线程标识号

iOS开发 - 多线程实现方案之Pthread篇