iOS多线程实现1-pthread

1 操作系统、进程、线程简单介绍

现在的程序都是在操作系统上跑,很少有裸机的,而且大部分的嵌入式应用也都支持操作系统,当然还有一些很低端的嵌入式设备没有操作系统。

iPhone手机跑的是iOS操作系统(基于Unix改造),操作系统用来管理设备的硬件设备,提供接口API(驱动程序)供不同的APP来调用,从而实现操作硬件,比如通过网卡实现网络访问、相机实现拍照、集成声卡实现发音、蓝牙实现无线传输等等。这里的APP可以简单的理解为一个进程,比如qq、微信、淘宝等等。

在iOS系统中,一个应用程序只允许有一个进程。不过,大家可能见过下图,下拉菜单的"今天",以今日头条为例(简书啥时间也开发个)。"今天"这里的今日头条和我们home页上的是不是一个应用开启的两个进程呢?而且在AppStore下载的时候,只下载了一次,然后这里就有了,难道不是吗?

首先,"今天"里面显示的也是今日头条,也是随AppStore下载时一并下载下来的,不过它只是一个widget,可以理解为它是一个运行在"下拉菜单"这个进程里面的一个线程,如果"今天"被关闭了,那么widget也随之停止运行。

这个是iOS8之后才有的特性,官方叫做扩展(Extension)

今日头条的widget

每个进程都拥有独立的存储空间沙盒和内存空间,不同的进程之间的内存肯定是不能相互访问,而且存储空间也是不能相互访问的。不过,iOS8之后,苹果推出来App Groups,可以是应用和widget还有Applewatch直接通过[[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.xxx"]函数访问group的内存空间,还需要做一些设置

开通App Groups

那我们面试的时候,或者平时提到的进程间通信是怎么回事呢?这个是苹果提供的scheme协议,如下:[[UIApplication sharedApplication] openURL:urlStr];

另外,安卓操作系统是允许多个进程的。

一个进程可以拥有多个线程,线程是真正执行程序流的执行单元。

2 pthread 

一套通用的多线程API,采用C语言编写,跨平台可移植,适用于UnixLinuxWindows等系统,但是使用起来难度比较大,生命周期也是由程序员来管理。在iOS编程中很少使用这种方法。

#import <pthread.h>
/// 点击屏幕创建一个线程
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    pthread_t thread; //创建线程
    NSString *str = @"helloWorld"; //创建参数
    // 参数1  线程编号的地址
    // 参数2  线程的属性
    // 参数3  线程要执行的函数(函数指针)(第三个参数可以,demo,*demo, 一般用&demo)
    // 参数4  线程要执行的函数的参数
    int result = pthread_create(&thread, NULL, &demo, (__bridge void *)(str));
    // __bridge  oc类型到c语言类型的一个转换
    // void *p = (__bridge void *)(str);
    NSLog(@"over %d",result);
}

/// 线程要执行的函数  传参数
void *(demo)(void *param){
    NSString *str = (__bridge NSString *)(param);
    NSLog(@"%@",str);
    return NULL;
}
原文地址:https://www.cnblogs.com/mddblog/p/4763511.html