zoukankan      html  css  js  c++  java
  • GCD使用dispatch_group_notify、dispatch_group_enter、dispatch_group_leave处理多线程同步操作

    一、简介

    dispatch_group_enter:通知group,下面的任务马上要放到group中执行了。

    dispatch_group_leave:通知group,任务完成了,该任务要从group中移除了。

    这两种通知可以在多线程间自由穿梭的。

    二、验证

    下面用代码验证下它们的作用。

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
        [self syncAction];
    }
    
    - (void)syncAction{
        
        dispatch_group_t group =dispatch_group_create();
        dispatch_queue_t globalQueue=dispatch_get_global_queue(0, 0);
        
        
        dispatch_group_enter(group);
        
        //模拟多线程耗时操作
        dispatch_group_async(group, globalQueue, ^{
            sleep(3);
            NSLog(@"%@---block1结束。。。",[NSThread currentThread]);
            dispatch_group_leave(group);
        });
        NSLog(@"%@---1结束。。。",[NSThread currentThread]);
        
        dispatch_group_enter(group);
        //模拟多线程耗时操作
        dispatch_group_async(group, globalQueue, ^{
            sleep(3);
            NSLog(@"%@---block2结束。。。",[NSThread currentThread]);
            dispatch_group_leave(group);
        });
        NSLog(@"%@---2结束。。。",[NSThread currentThread]);
        
        dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
            NSLog(@"%@---全部结束。。。",[NSThread currentThread]);
        });
    
    }

    运行app,点击页面打印的结果如下:

    2016-12-23 09:46:27.853 CPMNetworking[1341:36092] <NSThread: 0x600000068600>{number = 1, name = main}---1结束。。。
    2016-12-23 09:46:27.856 CPMNetworking[1341:36092] <NSThread: 0x600000068600>{number = 1, name = main}---2结束。。。
    2016-12-23 09:46:30.923 CPMNetworking[1341:36550] <NSThread: 0x608000263f00>{number = 4, name = (null)}---block1结束。。。
    2016-12-23 09:46:30.930 CPMNetworking[1341:36176] <NSThread: 0x6000002647c0>{number = 5, name = (null)}---block2结束。。。
    2016-12-23 09:46:30.930 CPMNetworking[1341:36176] <NSThread: 0x6000002647c0>{number = 5, name = (null)}---全部结束。。。

    结论:

    在开启了多线程执行任务时,若使用了dispatch_group_notify、dispatch_group_enter、dispatch_group_leave,也能有效的保证了等所有的子线程任务处理完后,有一个处理最后结果的地方。

  • 相关阅读:
    AngularJS 1.x系列:AngularJS过滤器(4)
    AngularJS 1.x系列:AngularJS控制器(3)
    AngularJS 1.x系列:AngularJS简介及第一个应用(2)
    AngularJS 1.x系列:Node.js安装及npm常用命令(1)
    MySQL系列:索引基本操作(4)
    基于 Mathematica 的机器人仿真环境(机械臂篇)[转]
    使用耳切法将多边形三角化【转】
    asp.net调用非托管dll,无法加载 DLL,找不到指定模块解决方法。【转】
    ASP.NET与非托管DLL的那些事儿【转+增】
    cesium常用设置【转】
  • 原文地址:https://www.cnblogs.com/zhou--fei/p/6213752.html
Copyright © 2011-2022 走看看