GCD

2018-12-02  本文已影响0人  开心一刻_

GCD的底层实现

基本理解

最好的是开辟3-6条线程,根据cpu的内核执行
异步:
异步并发队列:并不一定每一个线程都会开启一条新线程,当达到一个最大数量的数量之后会增加限制
异步串行队列: 只开辟了一个线程
重点
同步: 不会开辟一条子线程,要看同步的线程是否在子线程里。
异步: 会开辟一条线程,也有可能复用当前已经空闲的线程。
当前线程是哪一条就会阻塞哪一条。
串行:只会创建一条新的线程,不包括现在的线程,还有一个特点:线程里面的任务是一个一个执行的(也就是里面的线程是一个一个执行的)
并发:会创建很多线程,会出现复用已经用完的子线程的情况。

分析所有的问题都根据线程来分析。

并发:同步的话,任务按顺序执行。
异步:真正的并发。

同步和异步:能不能开辟一个线程。
串行和并发:针对的是队列。
最终的执行顺序:取决于他们的组合。

NSThread和gcd区别

 NSThread: 需要自己管理线程的生命周期
GCD:自动管理

死锁:

两个人物相互等待
  1. 主线程是串行队列。(串行队列的特点,是要等一个任务走完另一个任务才可以执行)
  2. 在主线成里面用异步不会开辟子线程。
  3. 需要等到主线成中的任务执行完才会执行主队列重点任务。

两个线程走完然后执行另一个方法

1.  dispatch_group_enter  dispatch_group_leave, dispatch_group_notify, 
配合使用
2. (栅栏)barrier 。
3. 自己手动代码控制。

线程安全:读取到的结果是可预见的
线程不安全:读取到的结果是不可预见的。

线程锁

线程锁:保证数据的安全
常用锁:信号量、NSLock、@synthesnise
线程锁的原理:确保只有一条线程在执行数据的读取。
dispatch_semaphore_t: 限制线程的并发数

atomic和nonatomic

  1. 为什么不用atomic
    automic等的set和get方法可以使用automic
    因为它并不能保证线程安全,而且耗性能

只能保证简单的set和get线程安全,如果增加了一些运算的操作就不是线程安全的了。
比如number++这样的操作,最后的结果不确定所以就是线程不安全的。
而且uilable等控件都是在主线成上面的,不存在所谓的线程安不安全,所以都应该用noautomic。

锁的区别

@synchronized

性能较差不建议使用,会隐式添加异常处理机制,如果代码报异常会释放该锁。

NSLock

锁定某一个资源

semaphore

信号量=1的时候就是互斥锁了。
它还可以调度线程(控制线程的最大并发数)
上一篇下一篇

猜你喜欢

热点阅读