小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
pthread一套通用的多线程API适用于Unix/Linux/Windows等系统跨平台、可移植使用难度大,线程的生命周期由程序员管理,在现实开发中几乎不使用。
pthread是POSIX线程的简称,是线程的POSIX标准。pthread基于C语言,是一种可以跨平台使用的方法,但是由于其使用难度较大,并且生命周期需要程序员手动管理,因此很少或几乎不用
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
pthread_t threadId = NULL;
// c字符串
char *cString = "HelloCode";
int result = pthread_create(&threadId, NULL, pthreadTest, cString);
if (result == 0) {
NSLog(@"成功");
} else {
NSLog(@"失败");
}
}
void *pthreadTest(void *para){
// 接 C 语言的字符串
// NSLog(@"===> %@ %s", [NSThread currentThread], para);
// __bridge 将 C 语言的类型桥接到 OC 的类型
NSString *name = (__bridge NSString *)(para);
NSLog(@"===>%@ %@", [NSThread currentThread], name);
return NULL;
}
使用pthread_create创建线程
参数:
pthread_t:要创建线程的结构体指针,通常开发的时候,如果遇到 C 语言的结构体,类型后缀_t / Ref结尾,同时不需要*- 线程的属性,
nil(空对象,OC使用的) ,NULL(空地址,C使用的) - 线程要执行的函数地址
-
void *:返回类型,表示指向任意对象的指针,和OC中的id类似
-
(*):函数名
-
(void *):参数类型,void *
- 传递给第三个参数(函数)的参数
返回值:
int类型0:创建线程成功- 非
0:创建线程失败的错误码,失败有多种可能
C与OC的桥接
__bridge只做类型转换,但是不修改对象(内存)管理权__bridge_retained(也可以使用CFBridgingRetain)将Objective-C的对象转换为Core Foundation的对象,同时将对象(内存)的管理权交给我们,后续需要使用CFRelease或者相关方法来释放对象__bridge_transfer(也可以使用CFBridgingRelease)将Core Foundation的对象转换为Objective-C的对象,同时将对象(内存)的管理权交给ARC