iOS多线程之pthread
什么是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(): //查询线程自身线程标识号