GCD

Posted LLLLLuke

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GCD相关的知识,希望对你有一定的参考价值。

GCD:全称Grand Central Dispatch (伟大的中央调度) 纯C语言 提供了非常强大的函数

优势:

1.GCD 是苹果为多核的并行运算提供的解决方案

2.会自动的管理线程的生命周期(创建线程,调度任务,销毁线程)

3.只需要告诉GCD执行什么就可以了,不用编写任何管理线程的(线程数是由GCD来决定的)

核心:

任务:执行什么操作

队列:用来存放什么任务

创建GCD的步棸:

创建任务

将任务添加到队列中(GCD会自动的将队列中的任务取出来,放到对应的线程中去执行,任务的取出遵循FIFO(队列)原则:先进先出,后进后出)

串行队列:让任务一个一个的去执行,一个执行完去执行下一个
并行队列:可以让多个任务去并发执行 只在异步函数下有效

// 创建队列
1.串行队列:
dispatch_queue_t queen
=dispatch_queue_create("test",DISPATCH_QUEUE_SERIAL);

2.并行队列
dispatch_queue_t queen
=dispatch_queue_create("test",DISPATCH_QUEUE_CONCURRENT);

//创建任务  
dispatch_block_t task1=^{
        
        [NSThread sleepForTimeInterval:1.0];
        NSLog(@"task1  %@",[NSThread currentThread]);
    };
// 把任务添加到队列中

1.异步执行
dispatch_async(queen, task1);
2.同步执行
dispatch_async(queen, task1);

同步和异步决定了要不要去开辟新的线程
同步:在当前线程中去执行任务 不具备开启线程的能力

串行同步:不开启新线程,任务依次执行
串行异步:开启新线程,任务依次执行

并行同步:不开启新线程,任务依次执行
并行异步:开启新线程,任务并发执行

全局队列:
dispatch_get_global_queue(<#long identifier#>, <#unsigned long flags#>)(是并发队列的一种)
全局同步:不开启新线程,任务依次执行
全局异步:开启新线程,任务并发执行

主队列:dispatch_get_main_queue()(串行队列的一种)(这个队列上的任务在主队列中进行)
主队异步:不开启新线程,任务顺序执行
主队同步:(造成死锁)原因:主线程执行任务从上向下一次执行,当到这个地方时,主线程等待去执行这个主队列的任务,主队列的任务等待着主线程空闲下来,把任务放进去,造成相互等待
解决:

   // 开辟新的线程 解放路主线程.

    

    dispatch_async(dispatch_get_global_queue(0, 0), ^{

        dispatch_sync(dispatch_get_main_queue(), ^{

            [NSThread sleepForTimeInterval:1.0];

            NSLog(@"%@ task1",[NSThread currentThread]);

        });

        dispatch_sync(dispatch_get_main_queue(), ^{

            NSLog(@"%@ task2",[NSThread currentThread]);

        });

    });

 





 

 

其余用法:
// 延迟加载 模拟网络延迟
  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
   
// 要执行的代码块
    
    });

// 一次加载
/*
1.一次执行线程是安全的
     2.与互斥锁相比 安全性是比较高的
     3,一般会用来单例上
*/

  for (int i=0; i<100000; i++) {
     
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            
            NSLog(@"s");
            
            onceToken=0;
            
        });



// 调度组:

dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        
        
        NSLog(@"%@",[NSThread currentThread]);
     
        
            dispatch_sync(dispatch_get_global_queue(0, 0), ^{
                NSLog(@"下载第一首歌  %@", [NSThread currentThread]);
            });
            dispatch_sync(dispatch_get_global_queue(0, 0), ^{
                NSLog(@"下载第2首歌  %@", [NSThread currentThread]);
            });
    
            dispatch_sync(dispatch_get_global_queue(0, 0), ^{
                NSLog(@"下载第3首歌  %@", [NSThread currentThread]);
            });

    });
    
    // 如果组里面的任务执行完毕 通知执行下面的代码
    
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        
        NSLog(@"下载完成");
    });
同步任务:
dispatch_async(dispatch_get_global_queue(0, 0), ^{
        
        dispatch_sync(dispatch_get_global_queue(0, 0), ^{
           
            NSLog(@"1  %@",[NSThread currentThread]);
        });
        dispatch_sync(dispatch_get_global_queue(0, 0), ^{
            
            NSLog(@"2  %@",[NSThread currentThread]);
        });
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            
            NSLog(@"3  %@",[NSThread currentThread]);
        });
        
    });

 

以上是关于GCD的主要内容,如果未能解决你的问题,请参考以下文章

代码笔记iOS-GCD用法

我写的由 GCD 代码支持的读写器锁导致并行测试中的死锁

swiftBlockOperation和GCD实用代码块

iOS多线程GCD详解

GCD的常用代码块

GCD