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中的多线程小记)