zoukankan      html  css  js  c++  java
  • iOS GCD的队列和线程

    1、队列分为 串行队列 和 并行队列

    2、线程分为 同步线程 和 异步线程

    GCD运行需要队列,先创建队列

    一、串行队列创建

        //串行队列的创建  参数队列名 和 NULL
        dispatch_queue_t queueA = dispatch_queue_create("queueA", NULL);
        
        //系统提供一个全局串行队列 也就是主线程
        // dispatch_get_main_queue()

    二、并行队列创建

        //GCD默认提供全局并发队列 //第一个参数表示优先级 0:默认,2:高,-1:低
        dispatch_queue_t queueB = dispatch_get_global_queue(0, 0); //DISPATCH_QUEUE_PRIORITY_DEFAULT = 0
        

    三、异步线程 + 并发队列 = 线程执行顺序是不固定的。项目中一般都是这种组合

        //GCD异步线程 + 并发队列B
        dispatch_async(queueB, ^{
            
            NSLog(@"网络请求1");
        });
        
        dispatch_async(queueB, ^{
            
            NSLog(@"网络请求2");
        });
        
        dispatch_async(queueB, ^{
            
            NSLog(@"网络请求3");
        });
    
    //打印结果
    2021-04-24 21:42:42.175828+0800 BaseDemo[7676:275823] 网络请求1
    2021-04-24 21:42:42.175830+0800 BaseDemo[7676:275827] 网络请求3
    2021-04-24 21:42:42.175867+0800 BaseDemo[7676:275819] 网络请求2

    如果要按顺序 可以加个信号量 信号量一般防止资源安全

        // 创建信号量 信号量 = 1; 只走一个线程
        dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
        
        //等待 信号量 - 1;等待时间= DISPATCH_TIME_FOREVER = 永远
        dispatch_semaphore_wait(semaphore, 1);
        //GCD异步线程 + 并发队列B
        dispatch_async(queueB, ^{
    
            sleep(1);
            NSLog(@"网络请求1");
            //信号量加一 程序继续向下
            dispatch_semaphore_signal(semaphore);
            
        });
        
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_async(queueB, ^{
            
            sleep(1);
            NSLog(@"网络请求2");
            dispatch_semaphore_signal(semaphore);
        });
        
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_async(queueB, ^{
            
            sleep(1);
            NSLog(@"网络请求3");
            dispatch_semaphore_signal(semaphore);
        });
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_async(queueB, ^{
            
           
            sleep(1);
            NSLog(@"网络请求4");
            dispatch_semaphore_signal(semaphore);
        });
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_async(queueB, ^{
            
            sleep(1);
            NSLog(@"网络请求5");
            dispatch_semaphore_signal(semaphore);
        });
        NSLog(@"我是外面线程");
    
    //打印结果
    2021-04-24 22:03:41.112360+0800 BaseDemo[7966:295504] 网络请求1
    2021-04-24 22:03:42.114488+0800 BaseDemo[7966:295504] 网络请求2
    2021-04-24 22:03:43.117322+0800 BaseDemo[7966:295504] 网络请求3
    2021-04-24 22:03:44.118532+0800 BaseDemo[7966:295504] 网络请求4
    2021-04-24 22:03:44.119006+0800 BaseDemo[7966:295015] 我是外面线程
    2021-04-24 22:03:45.124105+0800 BaseDemo[7966:295504] 网络请求5

    有空再加

  • 相关阅读:
    python爬虫实例——爬取歌单
    第一次接触稍大一点的项目有感——规范
    Ajax学习——ajax提交目的是返回刷新页面某个位置的内容
    C++ STL(标准模板库)的学习了解
    各高级编程语言分类分析
    ubuntu安装后中出现如下启动报错的错误
    解决GitHub下载慢的问题
    caffe的CPU编译需要更改的地方
    拐点处选择聚类K值
    python处理大规模数据时,出现memory
  • 原文地址:https://www.cnblogs.com/qq95230/p/14698440.html
Copyright © 2011-2022 走看看