《高性能iOS开发》--并发编程阅读笔记

常用多线程创建管理方式对比:

• GCD

直接基于C语言的实现,执行速度最快,性能最好,只需关注操作,OS自动管理
♦ 抽象程度最高。
♦ 两种队列开箱即用:main 和 global。
♦ 可以创建更多的队列(使用 dispatch_queue_create)。
♦ 可以请求独占访问(使用 dispatch_barrier_sync 和 dispatch_barrier_async)。
♦ 基于线程管理。
♦ 硬性限制创建 64 个线程。

• NSOperationQueue

对CGD 的封装,使其更接近面向对象,更易于理解和手动管理
♦ 无默认队列。
♦ 应用管理自己创建的队列。
♦ 队列是优先级队列。
♦ 操作可以有不同的优先级(使用 queuePriority 属性)。
♦ 使用 cancel 消息可以取消操作。注意,cancel 仅仅是个标记。如果操作已经开始 执行,则可能会继续执行下去。
♦ 可以等待某个操作执行完毕(使用 waitUntilFinished 消息)。

• NSThread

苹果自由线程管理方式,可控性最强,但同时使用也较复杂
♦ 低级别构造,最大化控制。
♦ 应用创建并管理线程。
♦ 应用创建并管理线程池。
♦ 应用启动线程。
♦ 线程可以拥有优先级,操作系统会根据优先级调度它们的执行。
♦ 无直接 API 用于等待线程完成。需要使用互斥量(如 NSLock)和自定义代码。

线程安全:

主要有两种方案:
1:使多线程下的共享状态(数据)不可修改
2:保证多线程下的共享状态(数据)是线程安全的

高级别锁

1:原子属性 (atomic) 原子属性是实现应用状态线程安全的一个良好开始。如果一个属性是 atomic,则修改和读取肯定都是原子的,默认属性 但存在一定开销,要避免滥用。而且无法避免同线程情况下多操作同时间进行的情况

2:互斥锁(@synchronized(obj))指令@synchronized()通过对一段代码的使用进行加锁。其他试图执行该段代码的线程都会被阻塞,直到加锁线程退出执行该段被保护的代码段,也就是说@synchronized()代码块中的最后一条语句已经被执行完毕的时候。
参数 obj 为互斥锁传入临界区的信号量即为需要加锁的对象(一般为self),临界区能保证永远只有一个线程执行.Objective-C中的同步特性是支持递归的。一个线程是可以以递归的方式多次使用同一个信号量的;
其他的线程会被阻塞直到这个线程释放了自己所有的和该信号量相关的锁,也就是说通过正常执行或者是通过异常处理的方式退出了所有的@synchronized()代码块。
@synchronized(self) {
}

低级别锁

NSLock 这是一种低级别的锁。一旦获取了锁,执行则进入临界区,且不会允许超过一个线程并 行执行。释放锁则标记着临界区的结束。
1 将锁声明为一个私有字段,也可以用属性来表示锁。  初始化锁。
2 获取锁,进入临界区。
3 在临界区,任意时刻最多只允许一个线程执行。
4 释放锁标记着临界区的结束。其他线程现在能够获取锁了。 NSLock 必须在锁定的线程中进行解锁。

NSCondition 有些情况需要协调线程之间的执行。例如,一个线程可能需要等待其他线程返回结果。 NSCondition 可以原子性地释放锁,从而使得其他等待的线程可以获取锁,而初始的线 程继续等待。
一个线程会等待释放锁的条件变量。另一个线程会通知条件变量释放该锁,并唤醒等待
中的线程。
lock :锁定 wait:等待 signal:获取信号(线程继续) unlock:解锁

你可能感兴趣的:(《高性能iOS开发》--并发编程阅读笔记)