美文网首页
iOS:多线程(一) —— pthread

iOS:多线程(一) —— pthread

作者: G_Jayson | 来源:发表于2019-07-18 17:58 被阅读0次

前言

在日常开发中,多线程的使用能帮助我们解决很多问题,比如大量数据的运算,复杂程序的执行,以及利用锁来实现一些需求,本系列文章主要介绍 iOS 中多线程实现技术的用法。

  • 多线程
    一个进程中可以开启多条线程,每条线程可以并行执行不同的任务,以充分利用资源,提高运算效率。

  • 多线程原理
    同一时间,CPU 只能处理 1 条线程,只有 1 条线程在执行,多线程并发执行,其实是 CPU 快速地在多条线程之间调度(切换),如果 CPU 调度线程的时间足够快,就造成了多线程并发执行的假象,并不是 CPU 在同一时刻同时执行多个任务。

  • 优点
    能适当提高程序的执行效率;
    能适当提高资源利用率(CPU、内存利用率)。

  • 缺点
    开启线程需要占用一定的内存空间(默认情况下,主线程占用1M,子线程占用512KB),如果开启大量的线程,会占用大量的内存空间,降低程序的性能;
    线程越多,CPU 在调度线程上的开销就越大。

在 iOS 中,多线程解决方案主要有以下四种:

多线程解决方案

iOS:多线程(二) —— NSThread

这篇文章我们先来介绍 pthread

pthread 简介

pthread 是一套通用的多线程的 API,可以在Unix / Linux / Windows 等系统跨平台使用,使用 C 语言编写,需要程序员自己管理线程的生命周期,使用难度较大。

pthread 简单使用

    NSLog(@"%s : %@", __func__, [NSThread currentThread]);
    
    /**************************  创建线程  *************************/
    
    // pthread
    
    pthread_t thread = NULL;
    NSString *paramStr = @"paramStr";

    // 可接收返回值判断线程有没有创建成功  0 成功 !0 失败
    int res = pthread_create(&thread,               // 线程对象,传递地址
                   NULL,                            // 线程属性,可设置为null
                   pthreadMethod,                   // 指向函数的指针
                   (__bridge void *)(paramStr));    // 函数需要接受的参数,可为null

    if (res == 0) {
        NSLog(@"线程创建成功!pthread begin");
    }

    // 设置子线程的状态为 detached, 则该线程运行结束后会自动释放所有资源,或者在子线程中添加 pthread_detach(pthread_self()),其中 pthread_self() 是获得线程自身的 id
    pthread_detach(thread);

    NSLog(@"pthread end");



// pthread执行方法
void *pthreadMethod(void *parma) {
    for (NSInteger i = 0; i < 5; i++) {
        NSLog(@"%ld --> %s : %@   param: %@", i, __func__, [NSThread currentThread], (__bridge NSString *)(parma));
        [NSThread sleepForTimeInterval:1.0];  // 模拟耗时
    }
    
    return NULL;
}

pthread_create() 就是创建线程的方法,只需填写四个参数,就可以创建线程,我们来看一下输出

pthread 调用方法 输出
pthreadMethod() 的方法是在子线程执行,而主线程的输出先于子线程执行,说明子线程的耗时任务不会影响主线程的执行逻辑。

pthread 其他方法及参数

pthread_t: 线程ID
pthread_attr_t: 线程属性
pthread_create(): 创建一个线程
pthread_exit(): 终止当前线程
pthread_cancel(): 中断另外一个线程的运行
pthread_join(): 阻塞当前的线程,直到另外一个线程运行结束
pthread_attr_init(): 初始化线程的属性
pthread_attr_setdetachstate(): 设置脱离状态的属性
pthread_attr_getdetachstate(): 获取脱离状态的属性
pthread_attr_destroy(): 删除线程的属性
pthread_kill(): 向线程发送一个信号
pthread_equal(): 对两个线程的线程标识号进行比较
pthread_detach(): 分离线程
pthread_self(): 查询线程自身线程标识号

以上是关于 pthread 的介绍和简单使用的说明,相关 demo 请参考
https://github.com/G-Jayson/Multi-thread

相关文章

网友评论

      本文标题:iOS:多线程(一) —— pthread

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