iOS中的多线程小记

1.多线程方案有哪几种?

(1).pthread           一套通用的多线程API;适用于Unix/Linux/Windows等系统;跨平台/可移植; 使用难度大

(2)NSThread        基于pthread的OC封装,使用更加面向对象,简单易用,可直接操作线程对象

(3).GCD                一套C语言的API,旨在替代NSThread等多线程技术,充分利用设备的多核

(4).NSOperation   基于GCD的OC封装,使用更加面向对象,同时比GCD多了一些更加简单实用的功能

2.GCD队列类型

串行队列和并发队列两种.

同步函数:

    +串行队列       不会开启新的线程,所有任务在当前线程串行执行

    +并发队列        不会开启新的线程,所以任务在当前线程串行执行

    +主队列            不会开启新的线程,串行执行任务

异步函数:

    +串行队列          会开一条新线程,所有任务在子线程中串行执行

    +并发队列          会开多条线程,所有任务并发执行

    +主队列               不会开新线程,所有任务在主线程串行执行

*注意:使用sync(同步函数)往当前串行队列中添加任务,会卡主当前的串行队列,产生死锁

3.线程安全的处理手段?了解的锁有哪些?

产生线程安全的原因:多个线程同时抢夺同一块资源

1.OSSpinLock(已过时)

自旋锁,等待锁的线程会处于忙等(busy-wait)状态,类似于while循环,一直在占用着CPU的资源

目前已经不再安全,可能出现优先级反转的问题

如果等待锁的优先级比较高,它会一直占用CPU的资源,优先级低的锁就无法释放锁

2.os_unfair_lock

os_unfair_lock用于取代OSSpinLock,从iOS10开始支持,从底层看,等待os_unfair_lock的锁会处于休眠,并非忙等

3.pthread_mutex

互斥锁,等待线程的锁会处于休眠的状态

4.dispatch_semaphore(信号量)

通过设置信号量的初始值,可以用来控制线程的最大并发数量,类似于NSOperationQueue的maxConcurrentOperationCount,来达到避免多个线程抢夺资源的情况

5.dispatch_queue

通过DISPATCH_QUEUE_SERIAL也可以达到同样的效果

6.NSLock

对pthread_mutex普通锁的封装

7.NSRecursiveLock(递归锁)

对pthread_mutex递归锁的封装

8.NSCondition

9.NSConditionLock

10.@synchronized

*注意:基于性能考虑,推荐使用dispatch_semaphore

4.自旋锁和互斥锁的对比?

自旋锁:

    预计线程等待锁的时间比较短

    CPU资源不紧张,多核处理器

    加锁的代码(临界区)经常被调用,但竞争很少发生

互斥锁:

    预计线程等待锁的时间比较长

    CPU资源紧张,单核处理器

    加锁的代码(临界区) 竞争非常激烈

    临界区的代码复杂或者循环量非常大

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • iOS多线程实践中,常用的就是子线程执行耗时操作,然后回到主线程刷新UI。在iOS中每个进程启动后都会建立一个主线...
    jackyshan阅读 1,518评论 2 12
  • 一.概述 1.基本概念 同步与异步的概念 同步 必须等待当前语句执行完毕,才可以执行下一个语句。 异步 不用等待当...
    Jt_Self阅读 500评论 0 1
  • 前言: 最近想回顾一下多线程问题,看到一篇文章写的非常详细,为了便于以后查找以及加深印象,就照着原文摘录了下文,原...
    FM_0138阅读 1,015评论 1 1
  • 前言 iOS开发中由于各种第三方库的高度封装,对锁的使用很少,刚好之前面试中被问到的关于并发编程锁的问题,都是一知...
    喵渣渣阅读 3,773评论 0 33
  • 写这个计划时,2018年已经过了一半了,不再计划了,现在就开始执行。有想法就及时写出来,就像当年在高中一样,每周至...
    邢玉辉阅读 212评论 0 2