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资源紧张,单核处理器
加锁的代码(临界区) 竞争非常激烈
临界区的代码复杂或者循环量非常大