什么是pthread
POSIX线程(POSIX threads),简称Pthreads,是线程的POSIX标准。该标准定义了创建和操纵线程的一整套API。在类Unix操作系统(Unix、Linux、Mac OS X等)中,都使用Pthreads作为操作系统的线程。
pthread的使用
一般情况在iOS开发中我们很少使用pthread来创建线程,pthread常见跨平台框架中多线程创建。pthread是c语言框架,在程序开发过程中需要程序员自己管理内存。
1、使用pthread创建线程
在使用pthread创建线程前需要导入:#import<pthread.h>
- (void)pthreadDemo{
//? ? pthread属于POSIX多线程开发框架
? ? /**线程创建
?? ? *参数1:<#pthread_t? _Nullable *restrict _Nonnull#> 指向线程代号的指针
?? ? *参数2:<#const pthread_attr_t *restrict _Nullable#> 线程的属性
?? ? *参数3:<#void * _Nullable (* _Nonnull)(void * _Nullable)#> 指向函数(线程要执行的函数)的指针
? ? ? void *? (*)? ? ? (void *)
?? ? 返回值? (函数指针)? (参数)
?? ? void *? 和OC中的? id 是等价的!
?????*参数4:<#void *restrict _Nullable#> 传递给该函数的参数
?? ? 返回值:在c语言框架中常见,0表示正确,非0表示不正确
?? ? */
? ? NSString *str = @"pthreadDemo";
? ? pthread_tthreadId;
? ? intresult =pthread_create(&threadId,NULL, &demo, (__bridgevoid*)str);//混合开发时,如果在 C 和 OC 之间传递数据,需要使用 __bridge 进行桥接,桥接的目的就是为了告诉编译器如何管理内存。
? ? if(result ==noErr) {//?noErr == 0
? ? ? ? NSLog(@"OK");
? ? }else{
? ? ? ? NSLog(@"error %d",result);
? ? }
}
//线程要执行的函数
void*demo(void*para){
? ? NSLog(@"%@%@",[NSThread currentThread],para);
? ? return NULL;
}
2、pthread内置函数
pthread_create()://创建一个线程
pthread_exit()://终止当前线程
pthread_cancel()://中断另外一个线程的运行
pthread_join()://阻塞当前的线程,直到另外一个线程运行结束
pthread_attr_init()://初始化线程的属性
pthread_attr_setdetachstate()://设置脱离状态的属性(决定这个线程在终止时是否可以被结合)
pthread_attr_getdetachstate()://获取脱离状态的属性
pthread_attr_destroy()://删除线程的属性
pthread_kill()://向线程发送一个信号
用于 mutex 和条件变量
pthread_mutex_init()???? //初始化互斥锁
pthread_mutex_destroy() ? ?// 删除互斥锁
pthread_mutex_lock(): ? ?//占有互斥锁(阻塞操作)
pthread_mutex_trylock(): ? ?//试图占有互斥锁(不阻塞操作)。即,当互斥锁空闲时,将占有该锁;否则,立即返回。
pthread_mutex_unlock(): ? ? //释放互斥锁
pthread_cond_init(): ? ?//初始化条件变量
pthread_cond_destroy(): ? ?//销毁条件变量
pthread_cond_signal(): ? ? //唤醒第一个调用pthread_cond_wait()而进入睡眠的线程
pthread_cond_wait(): ? ? //等待条件变量的特殊条件发生
Thread-local storage(或者以Pthreads术语,称作线程特有数据):
pthread_key_create():???? //分配用于标识进程中线程特定数据的键
pthread_setspecific(): ? ? //为指定线程特定数据键设置线程特定绑定
pthread_getspecific(): ? ? ? ? //获取调用线程的键绑定,并将该绑定存储在 value 指向的位置中
pthread_key_delete(): ? ? //销毁现有线程特定数据键
pthread_attr_getschedparam(); ? ?//获取线程优先级
pthread_attr_setschedparam(); ? ?//设置线程优先级
pthread_equal(): ? ? //对两个线程的线程标识号进行比较
pthread_detach(): ? ? //分离线程
pthread_self(): ? ? //查询线程自身线程标识号