多线程

作者: J星O海E | 来源:发表于2021-07-03 18:03 被阅读0次

    线程和进程

    进程:进程是指系统中正在运行的一个应用程序,进程之间是相互独立的,拥有专有的内存。

    线程:线程是进程的基本执行单元,一个进程的所有任务都在线程中执行,一个进程可以拥有多个线程,这些线程可以共享进程里的资源。

    为什么要在主线程更新UI

    因为 UIKit 框架不是线程安全的框架,当在多个线程进行 UI 操作,有可能出现资源抢夺,导致问题。

    多线程技术方案

    pthread:一套用 C 语言写的通用的多线程 API,线程生命周期由程序员管理,现在 iOS 中用到 pthread 的多数情况是使用 pthread_mutex 互斥锁,性能较高。

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

    GCD: 苹果公司为多核的并行运算提出的解决方案,纯C。会自动充分利用设备的多核。会自动管理线程的生命周期。

    NSOperation:是 OC 语言中基于 GCD 的面向对象的封装

    GCD

    执行任务的方式

    dispatch_sync:必须等待当前语句执行完毕,才会执行下一条语句(阻塞);在当前线程中执行任务,不具备开启新线程的能力。

    dispatch_async:不用等待当前语句执行完毕,就可以执行下一条语句(不会阻塞);在新的线程中执行任务,具备开启新线程的能力。

    队列

    串行队列(DISPATCH _QUEUE _SERIAL) 以 FIFO 顺序处理传入的任务,即让任务一个接着一个执行。

    并发队列(DISPATCH _QUEUE _CONCURRENT) 可以让多个任务并发(同时)执行(自动开启多个线程执行任务); 并发功能只有在异步函数dispatch_async下才有效; 尽管任务同时执行,但是您可以使用 barrier 栅栏函数在队列中创建同步点(关于栅栏函数后面会讲到)。

    主队列(dispatch_queue_main_t) 主队列是一种特殊的串行队列,它特殊在与主线程关联,主队列的任务都在主线程上执行,主队列在程序一开始就被系统创建并与主线程关联。

    顺序 & 优先级

    1、如果用的是串行队列,那么队列里的任务会按照FIFO依次执行。

    限制:必须是串行队列。

    2、设置队列的优先级,优先级高的队列里的任务会优先执行。全局队列在创建时的第一个参数就是设置优先级。自定义队列可以使用dispatch_set_target_queue来设置优先级。

    限制:必须在不用优先级的队列里。

    3、同一个队列,且是并行队列,如何保证顺序

    信号量:dispatch_semaphore_t

    栅栏函数:dispatch_barrier_async

    队列组: Dispatch Group 队列组

    相关文章

      网友评论

          本文标题:多线程

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