001 线程
运行时执行的一组指令序列.进程启动时的主要线程被称为主线程.所有的UI的元素都需要在主线程中创建和管理.
002 线程开销
时间开销 内核消耗 (内存空间)
003 内核数据结构
每个线程大约消耗1KB的内核空间.这块内存用于存储与线程有关的数据结构和属性,这块内存是联动内存.
004 栈空间
主线程的栈空间1M,而且无法修改.所有的二级线程默认分配512KB的栈空间.栈空间的大小可以改变.栈空间的最小值的16KB ,而且数值必须是4KB倍数.
005 GCD功能列表
任务或分发队列,允许主线程中执行.并行执行的串行执行.
分发组,实现对一组任务柱形的情况的跟踪,而与这些任务所基于的队列无关
信号量
屏障,允许在并行分发队列中创建同步的点
分发对象和管理源,实现更为底层的管理和监控
异步I/O,使用文件描述符合管道
006 操作与队列
NSOperation封装额一个任务以及和任务相关的数据和代码.而NSOperationQueue以先入先出的顺序控制一个或者多个这类任务的执行.可用maxConcurrentOperationCount属性控制队列.
NSTHread(开发人员管理全部并发)和GCD(OS管理并发)
GCD
抽象程度最高
两种对罗列开箱即用:main global
可以创建更多队列(使用dispatch_queue_create)
可以请求独立访问(占用dispatch_barrier_sync和dispatch_barrier_async)
基于线程管理
硬性限制创建64个线程
NSOperationQueue
无默认队列
应用管理自己的创建的队列
队列是优先级队列
操作可以有不同的优先级(queuePriority属性)
使用cancel消息可以取消操作,cancel仅仅是个标记,如果操作已经开始执行,则可能会继续执行下去
可以等待某个操作执行完毕(使用waitUntilFnished消息)
NSThread
低级别构造,最大控制
应用创建并管理线程
应用创建并管理线程池
应用启动线程
线程可以拥有优先级,操作系统会根据优先级调度它们的执行
无直接API用于等待线程完成,需要使用互斥量(如NSLock)和自定义代码
原子属性
如果一个属性是atomic,则修改和读取肯定都是原子的.这样可以阻止两个线程同时更新一个值,反之则有可能导致错误的状态,正在修改属性的线程必须处理完毕其他线程才能开始处理.很多属性都是原子性,如果能够保证某个属性在任何时刻都不会被多个线程访问,那最好还是将其标记为nonatomic.
将属性类型设置成atomic@property (atomic, copy) NSString *lastName;
使用@synchronized指令可以创建一个信号量,并进入临界区,临界区在任何时刻都只能被一个线程执行.取得对self的对象所,一切相关的修改都会被一同处理,而不会发生竞争状态.这样任然能够高并发执行,代码即实现了高并发,有设置警戒线以防止数据冲突.
还有三种所保持线程安全:NSLock NSRecursiveLock NSCondition