OC_多线程概念与pthread

463 阅读2分钟

基本概念

进程

在系统中运行的一个应用程序,每个进程都是独立的,每个进程都运行在其专用且受保护的内存空间内。

线程

一个进程 (程序) 的所有任务都在线程内进行,每个进程至少拥有一个线程 (主线程)。

多线程

多线程是指在一个进程中开启多条线程,多条线程可以并行执行不同的任务,多条线程并发执行的本质是CPU在多条线程之间不断地调度。

主线程

在一个ios程序运行后,会默认开启一条线程,称为“主线程”或“UI进程”,用于处理UI事件和显示、刷新UI。

实现方法

pthread

  • 使用C语言。
  • 跨平台\可移植。
  • 有一套通用的API。
  • 其生命周期由程序员管理。
  • 适用于Unix\Linux\Windows等系统。
  • 使用难度大,几乎不使用。

NSThread

  • 使用OC语言。
  • 更加面向对象。
  • 生命周期由程序员管理。
  • 简单易用,可以对线程对象直接操作,偶尔使用。

GCD

  • 使用C语言。
  • 旨在替代NSThread等线程技术。
  • 充分利用设备多核。
  • 生命周期由系统管理,经常使用。

NSOperation

  • 基于GCD,使用OC语言
  • 比GCD多了一些简易的功能。
  • 使用更加面向对象。
  • 生命周期由系统管理,经常使用。

多线程的优缺点

优点

  • 能够适当提高程序执行效率。
  • 能够适当提高系统资源利用率。
  • 线程上的任务完成后,线程会自动销毁。

缺点

  • 开启线程需要占用一定的内存空间,线程开启过多会导致程序性能降低。
  • 线程开启越多,CPU在调用线程上的开销越大。
  • 让程序设计更加复杂。

pthread

使用pthread需要先导入头文件。

#import <pthread/pthread.h>
// 导入 pthread 头文件

使用pthread创建新线程的函数是:

pthread_create(<#pthread_t  _Nullable *restrict _Nonnull#>,     //线程编号的地址
<#const pthread_attr_t *restrict _Nullable#>,                   //线程的属性  
<#void * _Nullable (* _Nonnull)(void * _Nullable)#>,            //线程要执行的函数
<#void *restrict _Nullable#>    )                               //执行函数的参数

该函数返回值类型为int,成功时函数返回值为 1 ,失败返回 0 。

线程编号通过pthread_t pthread;的方式创建。

eg.

    #import "ViewController.h"
    #import <pthread/pthread.h>                 //引入头文件
    @interface ViewController ()

    @end

    @implementation ViewController

    - (void)viewDidLoad {
        [super viewDidLoad];
        pthread_t pthread;                      //创建线程编号  
        int result = pthread_create(&pthread,NULL, pthreadFunction, NULL);
        if (result)
            NSLog(@"success");
        else
            NSLog(@"fail");
    }

    void *pthreadFunction(void *param){
        NSLog(@"pthread");
        return NULL;
    }