zoukankan      html  css  js  c++  java
  • 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]);
            });
            
        });
  • 相关阅读:
    Django请求的生命周期图解及流程
    Django中请求的生命周期
    127.0.0.1和0.0.0.0和本机IP的区别
    Linux中errno的含义
    wireshark 过滤表达式
    GDB调试
    【LinuxShell】grep用法详解
    Linux下 tftp 服务器的安装与使用
    设备掐断重启
    GDB disassemble
  • 原文地址:https://www.cnblogs.com/zhubaofeng/p/5256527.html
Copyright © 2011-2022 走看看