4.2 Pthread

作者: 蓝田_Loto | 来源:发表于2016-04-15 14:09 被阅读89次

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正。


    本文相关目录:
    ==================== 所属文集:4.0 多线程 ====================
    4.1 多线程基础->1.0 进程 & 线程
    ······················ 2.0 多线程简介
    4.2 pthread
    4.3 NSThread->1.0 创建线程
    ····················· 2.0 线程属性
    ····················· 3.0 线程状态/线程生命周期
    ····················· 4.0 多线程安全隐患
    ····················· 5.0 线程间通讯和常用方法
    4.4 GCD->1.0 GCD简介和使用
    ·············· 2.0 线程间的通信
    ·············· 3.0 其他用法
    ·············· 4.0 GCD 的定时器事件
    4.5 NSOperation->1.0 NSOperation简介
    ························ 2.0 NSOperationQueue
    ························ 3.0 线程间通信
    ························ 4.0 自定义NSOperation
    4.6 RunLoop - 运行循环
    ===================== 所属文集:4.0 多线程 =====================


    4.2.1 创建线程 - pthread_create

    pthread_create

    /*
    <#pthread_t *restrict#>  线程的id,指向线程标识符的指针,C 语言中类型的结尾通常 _t/Ref,而且不需要使用 *
    <#const pthread_attr_t *restrict#> 用来设置线程的属性 (一般为 NULL)
    <#void *(*)(void *)#>  新建立的线程执行代码的函数,线程开启后需要调用的函数或方法 (指向函数的指针)
    <#void *restrict#>     运行函数的参数,线程的限制 (一般为 NULL)
    */
    
    返回值:
     - 若线程创建成功,则返回0
     - 若线程创建失败,则返回出错编号
    
    pthread_create(
              <#pthread_t *restrict#>,   // pthread_t :线程标识符.
              <#const pthread_attr_t *restrict#>,
              <#void *(*)(void *)#>,
              <#void *restrict#>
    );
    

    4.2.2 __bridge 桥接

    __bridge 桥接:

    1、在c语言和OC之间,对数据类型进行转成换
    2、通过桥接告诉c语言的函数,name就由C语言去管了```
    
    桥接的目的 :
    

    就是为了告诉编译器如何管理内存,为OC添加自动内存管理操作

    小结 :

    • 在 C 语言中,没有对象的概念,对象是以结构体的方式来实现的

    • 通常,在 C 语言框架中,对象类型以 _t/Ref 结尾,而且声明时不需要使用 *

    • C 语言中的 void * 和 OC 中的 id 是等价的

    • 在混合开发时,如果在 C 和 OC 之间传递数据,需要使用 __bridge 进行桥接,

    • 桥接的添加可以借助 Xcode 的辅助功能添加

    ```objc
    number = 1: 表示 主线程
    number != 1: 表示 子线程
    
    C语言中 void * == OC中的id
    C语言的数据类型,一般以  Ref / _t
    
    - OC框架 Foundation
    
    -  C语言 Core Foundation
    
      NSString *str1 = @"1111";
      CFStringRef str2 = (__bridge CFStringRef)(str1);
      CFRelease(str2);
    
      NSArray *array = nil;
      CFArrayRef arr = (__bridge CFArrayRef)(array);
    
      NSDictionary *dict = [NSDictionary dictionary];
      CFDictionaryRef cfdict = (__bridge CFDictionaryRef)(dict);
      CFRelease(cfdict);
    

    4.2.3 pthread的使用

    首先导入头文件

    #import <pthread.h>
    

    代码创建:

    // 创建线程,并且在线程中执行 demo 函数
    - (void)pthreadDemo {
    
      pthread_t threadId = NULL;
      NSString *str = @"Hello Pthread";
    
      int result = pthread_create(&threadId, NULL, demo, (__bridge void *)(str));
    
      if (result == 0) {
        NSLog(@"创建线程 OK");
      } else {
        NSLog(@"创建线程失败 %d", result);
      }
    }
    
    // 后台线程调用函数
    void *demo(void *params) {
      NSString *str = (__bridge NSString *)(params);
    
      NSLog(@"%@ - %@", [NSThread currentThread], str);
    
      return NULL;
    }
    



    作者:蓝田(Loto)
    出处: 简书

    如果你觉得本篇文章对你有所帮助,请点击文章末尾下方“喜欢”
    如有疑问,请通过以下方式交流:
    评论区回复微信(加好友请注明“简书+称呼”)发送邮件shorfng@126.com



    本文版权归作者和本网站共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

    相关文章

      网友评论

        本文标题:4.2 Pthread

        本文链接:https://www.haomeiwen.com/subject/tnrnlttx.html