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