GCD
2018-12-02 本文已影响0人
开心一刻_
GCD的底层实现
基本理解
最好的是开辟3-6条线程,根据cpu的内核执行
异步:
异步并发队列:并不一定每一个线程都会开启一条新线程,当达到一个最大数量的数量之后会增加限制
异步串行队列: 只开辟了一个线程
重点
同步: 不会开辟一条子线程,要看同步的线程是否在子线程里。
异步: 会开辟一条线程,也有可能复用当前已经空闲的线程。
当前线程是哪一条就会阻塞哪一条。
串行:只会创建一条新的线程,不包括现在的线程,还有一个特点:线程里面的任务是一个一个执行的(也就是里面的线程是一个一个执行的)
并发:会创建很多线程,会出现复用已经用完的子线程的情况。
分析所有的问题都根据线程来分析。
并发:同步的话,任务按顺序执行。
异步:真正的并发。
同步和异步:能不能开辟一个线程。
串行和并发:针对的是队列。
最终的执行顺序:取决于他们的组合。
NSThread和gcd区别
NSThread: 需要自己管理线程的生命周期
GCD:自动管理
死锁:
两个人物相互等待
- 主线程是串行队列。(串行队列的特点,是要等一个任务走完另一个任务才可以执行)
- 在主线成里面用异步不会开辟子线程。
- 需要等到主线成中的任务执行完才会执行主队列重点任务。
两个线程走完然后执行另一个方法
1. dispatch_group_enter dispatch_group_leave, dispatch_group_notify,
配合使用
2. (栅栏)barrier 。
3. 自己手动代码控制。
线程安全:读取到的结果是可预见的
线程不安全:读取到的结果是不可预见的。
线程锁
线程锁:保证数据的安全
常用锁:信号量、NSLock、@synthesnise
线程锁的原理:确保只有一条线程在执行数据的读取。
dispatch_semaphore_t: 限制线程的并发数
atomic和nonatomic
- 为什么不用atomic
automic等的set和get方法可以使用automic
因为它并不能保证线程安全,而且耗性能
只能保证简单的set和get线程安全,如果增加了一些运算的操作就不是线程安全的了。
比如number++这样的操作,最后的结果不确定所以就是线程不安全的。
而且uilable等控件都是在主线成上面的,不存在所谓的线程安不安全,所以都应该用noautomic。
锁的区别
@synchronized
性能较差不建议使用,会隐式添加异常处理机制,如果代码报异常会释放该锁。
NSLock
锁定某一个资源
semaphore
信号量=1的时候就是互斥锁了。
它还可以调度线程(控制线程的最大并发数)