GCD使用dispatch_group_notify、dispatch_group_enter、dispatch_group_leave处理多线程同步操作
2024-10-10 10:43:24
一、简介
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(, ); dispatch_group_enter(group); //模拟多线程耗时操作
dispatch_group_async(group, globalQueue, ^{
sleep();
NSLog(@"%@---block1结束。。。",[NSThread currentThread]);
dispatch_group_leave(group);
});
NSLog(@"%@---1结束。。。",[NSThread currentThread]); dispatch_group_enter(group);
//模拟多线程耗时操作
dispatch_group_async(group, globalQueue, ^{
sleep();
NSLog(@"%@---block2结束。。。",[NSThread currentThread]);
dispatch_group_leave(group);
});
NSLog(@"%@---2结束。。。",[NSThread currentThread]); dispatch_group_notify(group, dispatch_get_global_queue(, ), ^{
NSLog(@"%@---全部结束。。。",[NSThread currentThread]);
}); }
运行app,点击页面打印的结果如下:
-- ::27.853 CPMNetworking[:] <NSThread: 0x600000068600>{number = , name = main}---1结束。。。
-- ::27.856 CPMNetworking[:] <NSThread: 0x600000068600>{number = , name = main}---2结束。。。
-- ::30.923 CPMNetworking[:] <NSThread: 0x608000263f00>{number = , name = (null)}---block1结束。。。
-- ::30.930 CPMNetworking[:] <NSThread: 0x6000002647c0>{number = , name = (null)}---block2结束。。。
-- ::30.930 CPMNetworking[:] <NSThread: 0x6000002647c0>{number = , name = (null)}---全部结束。。。
结论:
在开启了多线程执行任务时,若使用了dispatch_group_notify、dispatch_group_enter、dispatch_group_leave,也能有效的保证了等所有的子线程任务处理完后,有一个处理最后结果的地方。
最新文章
- 终端下vim无法输入问题解决
- [1]开发准备-使用C#.NET开发基于本地数据缓存的PC客户端
- NetLink Communication Mechanism And Netlink Sourcecode Analysis
- firefox浏览器不能使用window.close的解决方案
- (转)一个JavaWeb项目开发总结
- 多个git账号的配置
- 安装依赖包时--save-dev以及-save的区别及意义
- SvUDID实现设备唯一标示
- c++中的隐藏、重载、覆盖(重写)
- C51编译器的扩展关键字
- CSS之纯CSS画的基本图形(矩形、圆形、三角形、多边形、爱心、八卦等)
- LPC1788系统时钟初始化
- Div.2 C. Dasha and Password
- 解决sql和beans中名字不一致问题
- linux tracepoint用法【转】
- android自定义listview实现header悬浮框效果
- ubuntu上安装multi-mechanize步骤
- Core统一日志处理
- Storm是什么
- centos7下kubernetes(6。运行应用)
热门文章
- DataGridView的DataGridViewComboBoxColumn列在编辑时自动弹出下拉列表
- jQuery 3.1.1 官方下载地址
- C# upnp
- AngularJS学习---REST和自定义服务(REST and Custom Services) ngResource step 11
- sqlserver,mysql,oracle通用的模拟和改进的全文搜索算法
- C# 配置错误定义了重复的“system.web.extensions/scripting/scriptResourceHandler”节
- mysql: symbol lookup error: /usr/local/lib/libreadline.so.6: undefined symbol: UP
- JS 获取服务器时间
- 20145225《Java程序设计》 2015—2016年学期课程总结
- c# 框架学习(nop )总结-------编辑功能