iOS多线程技术方案之pthread

222 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

pthread一套通用的多线程API适用于Unix/Linux/Windows等系统跨平台、可移植使用难度大,线程的生命周期由程序员管理,在现实开发中几乎不使用。
pthreadPOSIX线程的简称,是线程的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:创建线程失败的错误码,失败有多种可能

 COC的桥接

  • __bridge只做类型转换,但是不修改对象(内存)管理权
  • __bridge_retained(也可以使用CFBridgingRetain)将Objective-C的对象转换为Core Foundation的对象,同时将对象(内存)的管理权交给我们,后续需要使用CFRelease或者相关方法来释放对象
  • __bridge_transfer(也可以使用CFBridgingRelease)将Core Foundation的对象转换为Objective-C的对象,同时将对象(内存)的管理权交给ARC