线程GCD

本文只是学习他人知识点进行一定的总结巩固自己的理解
学习GCD看我就够了
iOS多线程全套

一、多线程的定义

计算机在运行一段程序的时候,会把该程序的CPU命令列配置到内存中,然后按照顺序一个一个执行命令列,这样1个CPU执行的CPU命令列为一条无分叉路径就是线程。
而有多条这样的执行指令列的路径存在时即为多线程。

二、实现多线程的4种方法

  • pthreads
  • NSThread
  • GCD
  • NSOperation & NSOperationQueuef

三、GCD

一些定义

  • Dispatch Queue:执行处理的等待队列

    1. Serial Dispatch Queue (串行队列) ——等待现在执行中处理结束再加入队列
      只会当一个处理执行完了才会将下一个任务交给线程处理
    2. Concurre Dispatch Queue (并发队列) ——不等待现在执行中处理结束,直接加入队列
      不需要等待前一个任务执行,几乎是同时交给线程处理的
  • dispatch_queue_create 创建队列

  • 同步与异步
    1.dispatch_async:表示异步:将指定的Block“非同步”加入Dispatch Queue,不做任何等待
    2.dispatch_sync:表示同步:将指定的Block“同步”的加入Dispatch Queue,在Block结束之前,dispatch_sync函数会一直等待

  • 死锁:由于dispatch_sync会等待Block执行结束才会继续往下执行,所以会产生死锁的情况

dispatch_queue_t main_queue = dispatch_get_main_queue();
    dispatch_sync(main_queue, ^{
        NSLog(@"main queue");
    });
    NSLog(@"go on");

产生死锁的原因一般是 在串行队列中并且是在一个线程中同步往这个线程提交一个Block

  • Dispatch Group(派发分组)
    把任务分组。调用者在这组任务执行完毕后会得到通知,并做相应的处理。
    创建方式有两种:
    dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(dispatch_group_t group);
dispatch_group_leave(dispatch_group_t group);

四、GCD的具体运用(更多使用可以看第二个链接)

//创建任务分组
dispatch_group_t group = dispatch_group_create();
//创建异步队列
dispatch_queue_t queue = dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);

dispatch_group_enter(group);
dispatch_group_async(group, queue, ^{
    dispatch_group_leave(group);
});

//所有队列里的任务执行完的通知
dispatch_group_notify(group, queue, ^{
     dispatch_async(dispatch_get_main_queue(), ^{
            
     });
});

你可能感兴趣的:(线程GCD)