线程GCD

作者: 我是好宝宝_6966 | 来源:发表于2018-08-22 15:50 被阅读0次

    本文只是学习他人知识点进行一定的总结巩固自己的理解
    学习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

          本文链接:https://www.haomeiwen.com/subject/ighdiftx.html