GDC dispatch_semaphore
当我们在处理一系列线程的时候,当数量达到一定量,在以前我们可能会选择使用NSOperationQueue来处理并发控制,但如何在GCD中快速的控制并发呢?答案就是dispatch_semaphore,对经常做unix开发的人来讲,我所介绍的内容可能就显得非常入门级了,信号量在他们的多线程开发中再平常不过了。
信号量是一个整形值并且具有一个初始计数值,并且支持两个操作:信号通知和等待。当一个信号量被信号通知,其计数会被增加。当一个线程在一个信号量上等待时,线程会被阻塞(如果有必要的话),直至计数器大于零,然后线程会减少这个计数。
在GCD中有三个函数是semaphore的操作,分别是:
dispatch_semaphore_create 创建一个semaphore
dispatch_semaphore_signal 发送一个信号
dispatch_semaphore_wait 等待信号
简单的介绍一下这三个函数,第一个函数有一个整形的参数,我们可以理解为信号的总量,dispatch_semaphore_signal是发送一个信号,自然会让信号总量加1,dispatch_semaphore_wait等待信号,当信号总量少于0的时候就会一直等待,否则就可以正常的执行,并让信号总量-1,根据这样的原理,我们便可以快速的创建一个并发控制来同步任务和有限资源访问控制
int data = 3;
__block int mainData = 0;
__block dispatch_semaphore_t sem = dispatch_semaphore_create(0);
dispatch_queue_t queue = dispatch_queue_create("StudyBlocks", NULL);
dispatch_async(queue, ^(void) {
int sum = 0;
for(int i = 0; i < 5; i++)
{
sum += data;
NSLog(@" >> Sum: %d", sum);
}
dispatch_semaphore_signal(sem);
});
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
for(int j=0;j<5;j++)
{
mainData++;
NSLog(@">> Main Data: %d",mainData);
}
dispatch_release(sem);
dispatch_release(queue);
2013-07-08 11:33:05.654 dispatch[1102:1e03] >> Sum: 3
2013-07-08 11:33:05.656 dispatch[1102:1e03] >> Sum: 6
2013-07-08 11:33:05.657 dispatch[1102:1e03] >> Sum: 9
2013-07-08 11:33:05.658 dispatch[1102:1e03] >> Sum: 12
2013-07-08 11:33:05.659 dispatch[1102:1e03] >> Sum: 15
2013-07-08 11:33:05.660 dispatch[1102:c07] >> Main Data: 1
2013-07-08 11:33:05.660 dispatch[1102:c07] >> Main Data: 2
2013-07-08 11:33:05.660 dispatch[1102:c07] >> Main Data: 3
2013-07-08 11:33:05.661 dispatch[1102:c07] >> Main Data: 4
2013-07-08 11:33:05.661 dispatch[1102:c07] >> Main Data: 5
通过信号量就可以保证,Main Data 永远在Sum之后执行
GDC dispatch_semaphore相关推荐
- Khronos 在GDC上的信息汇总:Vulkan,OpenXR,WebGL,glTF
Khronos 在GDC上的信息汇总:Vulkan,OpenXR,WebGL,glTF 游戏开发者大会,旧金山– The Khronos™ Group, 一个由领先硬件和软件公司组成的组织,在游戏开发 ...
- 米哈游CEO蔡浩宇GDC演讲:《原神》如何打造动人的开放世界?
<原神>于2020年席卷全球,获得了各国玩家与开发者极高的评价.游戏系统自不必说,被日系动画风的角色与开放世界美术吸引的玩家在全球也不可胜数. 在正在举行的2021 GDC游戏开发者大会上 ...
- 网易自动化UI测试解决方案Airtest Project亮相GDC
GDC开幕第一天,Google在GDC发布了一款由网易研发的游戏UI自动化测试方案:Airtest Project.21日,这项研发成果也展开了专门的讲座活动,向全球开发者公开演示. Airtest ...
- A Hands-on Look at Using Ray Tracing in Games with UE 4.22 GDC 2019
A Hands-on Look at Using Ray Tracing in Games with UE 4.22 GDC 2019 talker: Sjoerd De Jong (SR.ENGIN ...
- GCD dispatch_semaphore
当我们在处理一系列线程的时候,当数量达到一定量,在以前我们可能会选择使用NSOperationQueue来处理并发控制,但如何在GCD中快速的控制并发呢?答案就是dispatch_semaphore. ...
- gdc服务器维修公司,gdc服务器阵列架坏了
gdc服务器阵列架坏了 内容精选 换一换 本章节指导用户批量创建4块云硬盘,并挂载至云服务器.进入云硬盘页面.关于创建云硬盘的详细操作,请参见"云硬盘用户指南".本示例为批量创建4 ...
- gdc服务器故障输入信号超出范围,H1Z1信号输入超出范围 | 手游网游页游攻略大全...
发布时间:2016-01-25 情热传说身为最新的游戏,玩家可能遇见很多问题,其中显示信号超出范围就是一个,该如何解决呢? 情热传说身为最新的游戏,玩家可能遇见很多问题,其中显示信号超出范围就是一个, ...
- TCGA(三)--采用GDC API进行数据查询和获取
TCGA的数据可以通过API访问, 每个数据都有对应的多个属性,比如文件id(file_id), 病人编号(case_id以及barcode),case_id 和file_id 都是采用的UUID进行 ...
- 品质和创新成为 GDC 2017 “State of Unreal” 的焦点
新闻 游戏 作者 Daniel Kayser 按照传统,Epic Games 创始人兼首席执行官 Tim Sweeney 首先上台主持了"State of Unreal"开幕会议并 ...
最新文章
- 正则表达式判断号码靓号类型
- 姿态检测 树莓派_3.使用树莓派控制摄像头采集视频及运动检测
- 学Linux从编译命令开始——arm-linux-gcc常用参数讲解
- Oracle解析XML 节点信息并转换String 类型
- 運輸配送信息Delivery_Information
- python的unittest测试类代码实例
- java scriptengine e-_Java使用ScriptEngine(javax.script)
- vmware 14 激活码
- C++定时器和时间轮
- html设置ie兼容性视图,如何用脚本配置IE兼容性视图设置
- 云流化像素流技术解决方案之虚拟仿真系统
- 无影云桌面-网上电脑
- Nide.js安装配置
- 数量X金额=总额 再例如X抽成0.08等出抽成金额180,大师们帮忙改一下下,万分感谢!
- Cadence allegro PCB快速自动创建差分对
- POI操作Excel设置前景色背景色
- 什么是产品经理?主要职责是什么?
- u盘启动盘恢复计算机,U盘启动盘怎么恢复正常普通U盘?
- 足坛十大恶汉:张玉宁黑社会风波 辽猛将踢爆眼
- 常用数据集/工具下载地址
热门文章
- VSC为_计及功率控制模式的VSC-MTDC交直流并列运行系统概率潮流计算
- android 录屏自动运行,app自动化--Android通过adb录屏
- Redis的安装以及基本操作简介
- 【小白学习C++ 教程】十三、C++命名空间namespace
- linux配置usb主从_一种Linux下USB设备主从切换的实现
- 训练技巧 | 功守道:NLP中的对抗训练 + PyTorch实现
- 直播报名 | CUDA优化:高性能库cuBLAS使用指南
- 商汤 AI TECH DAY丨见大咖、拿OFFER、体验AI,一次就够!
- 商汤科技 中科院自动化所:视觉跟踪之端到端的光流相关滤波 | CVPR 2018
- HDU1520 Anniversary party 树形动态规划