ios多线程知识

一:进程

  正在进行中的程序被称为进程,负责程序运行的内存分配 每一个进程都有自己独立的虚拟内存空间

  线程

  线程是进程中一个独立的执行路径(控制单元) 一个进程中至少包含一条线程,即主线程 可以将耗时的执行路径(如:网络请求)放在其他线程中执行 创建线程的目的就是为了开启一条新的执行路径,运行指定的代码,与主线程中的代码实现同时运行

 

  优势

  充分发挥多核处理器优势,将不同线程任务分配给不同的处理器,真正进入“并行运算”状态 将耗时的任务分配到其他线程执行,由主线程负责统一更新界面会使应用程序更加流畅,用户体验更好 当硬件处理器的数量增加,程序会运行更快,而程序无需做任何调整

  弊端 新建线程会消耗内存空间和CPU时间,线程太多会降低系统的运行性能

  误区 多线程技术是为了并发执行多项任务,不会提高单个算法本身的执行效率

注:多线程实现的几种方式,在之前随笔中

二:GCD基本思想

  1)GCD的基本思想是就将操作s放在队列s中去执行 操作使用Blocks定义 队列负责调度任务执行所在的线程以及具体的执行时间 队列的特点是先进先出(FIFO)的,新添加至对列的操作都会排在队尾

  2)提示 GCD的函数都是以dispatch(分派、调度)开头的 队列 dispatch_queue_t 串行队列,队列中的任务只会顺序执行 并行队列,队列中的任务通常会并发执行

  3)操作 dispatch_async 异步操作,会并发执行,无法确定任务的执行顺序 dispatch_sync 同步操作,会依次顺序执行,能够决定任务的执行顺序

三:GCD内部怎么实现的(简述)

  1> iOSOS X的核心是XNU内核,GCD是基于XNU内核实现的

  2> GCDAPI全部在libdispatch库中

  3> GCD的底层实现主要有Dispatch Queue和Dispatch Source

   Dispatch Queue :管理block(操作)

   Dispatch Source :处理事件

四:操作

  不同队列中嵌套dispatch_sync的结果

  // 全局队列,都在主线程上执行,不会死锁 dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

  // 并行队列,都在主线程上执行,不会死锁 dispatch_queue_t q = dispatch_queue_create("cn.itcast.gcddemo", DISPATCH_QUEUE_CONCURRENT);

  // 串行队列,会死锁,但是会执行嵌套同步操作之前的代码

  dispatch_queue_t q = dispatch_queue_create("cn.itcast.gcddemo", DISPATCH_QUEUE_SERIAL);

  // 直接死锁

  dispatch_queue_t q = dispatch_get_main_queue();

  dispatch_sync(q, ^{

      NSLog(@"同步任务 %@", [NSThread currentThread]);

      dispatch_sync(q, ^{ NSLog(@"同步任务 %@", [NSThread currentThread]);

  });

});

 

五:GCD队列示意图

 

 

总结:

  • 串行队列,同步任务,不需要新建线程
  • 串行队列,异步任务,需要一个子线程,线程的创建和回收不需要程序员参与! “是最安全的一个选择”串行队列只能创建!
  • 并行队列,同步任务,不需要创建线程
  • 并行队列,异步任务,有多少个任务,就开N个线程执行
  • 无论什么队列和什么任务,线程的创建和回收不需要程序员参与。 线程的创建回收工作是由队列负责的
  • “并发”编程,为了让程序员从负责的线程控制中解脱出来!只需要面对队列和任务!
  • GCD在后端管理着一个线程池,GCD不仅决定着代码块将在哪个线程被执行,它还根据可用的系统资源对这些线程进行管理。通过集中的管理线程,缓解大量线程被创建的问题

  • 使用GCD,开发者可以将工作考虑为一个队列,而不是一堆线程,这种并行的抽象模型更容易掌握和使用

提示:不建议使用不同优先级的队列,因为如果设计不当,可能会出现优先级反转,即低优先级的操作阻塞高优先级的操作

 

 

 

posted @ 2014-08-19 12:58  春梦无痕  阅读(269)  评论(0编辑  收藏  举报