GCD之信号量机制二
在前面GCD之信号量机制一中介绍了通过信号量设置并行最大线程数,依此信号量还可以防止多线程访问公有变量时数据有误,下面的代码能说明。
1.下面是不采用信号量修改公有变量的值
dispatch_group_t group=dispatch_group_create();// dispatch_semaphore_t semaphore=dispatch_semaphore_create(1);dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);__block int count=1000;for (int i=0; i<100; i++) {//信号量减1,如果同时开启10个以上的线程,则信号量小于等于0,此时就会阻塞该线程。// dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);dispatch_group_async(group, queue, ^{int value = (arc4random() % 4) + 6;NSLog(@"%d-%d= %d",count,value,count-value);count=count-value;//每个线程执行减1后通过信号量通知加1,这样始终保持线程在10个之内// dispatch_semaphore_signal(semaphore);});}dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
2.运行结果如下:
3.声明一个初始值为1的信号量来开启线程修改公有变量时
dispatch_group_t group=dispatch_group_create();dispatch_semaphore_t semaphore=dispatch_semaphore_create(1);dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);__block int count=1000;for (int i=0; i<100; i++) {//信号量减1,如果同时开启10个以上的线程,则信号量小于等于0,此时就会阻塞该线程。dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);dispatch_group_async(group, queue, ^{int value = (arc4random() % 4) + 6;NSLog(@"%d-%d= %d",count,value,count-value);count=count-value;//每个线程执行减1后通过信号量通知加1,这样始终保持线程在10个之内dispatch_semaphore_signal(semaphore);});}dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
4.运行结果如下:
可以看到,第一代码段时修改公有变量时不是有序的,第二个代码段才是真正正确的修改顺序。这过程可取款的过程一样,金额是1000,可能在不同的地方同时取款,取款时不可能金额是像第一代码段那样。这个和C#的lock关键字有一样的效果。
GCD之信号量机制二相关推荐
- 二、操作系统——用信号量机制实现进程互斥、同步、前驱关系(详解)
一.什么是进程同步? 二.什么是进程互斥? 临界资源:一个时间段内只允许一个进程使用的资源 为了实现对临界资源的互斥访问,同时保证系统整体性能,需要遵循以下原则: 空闲让进.临界区空闲时,可以允许一个 ...
- 操作系统(二十二)用信号量机制实现进程互斥、同步、前驱关系
2.3.5 用信号量机制实现进程互斥.同步.前驱关系 目录 2.3.5 用信号量机制实现进程互斥.同步.前驱关系 2.3.5.1 用信号量机制实现进程互斥 2.3.5.2 用信号量机制实现进程同步 2 ...
- 操作系统(二十一)信号量机制
2.3.4 信号量机制 在前两节中我们分别学习了用软件方式以及硬件方式实现互斥访问,但是他们或多或少的存在一些问题,1965年荷兰的一名学者迪杰斯特拉(是的,就是那个男人)提出了信号量机制,有效的解决 ...
- 十六、用信号量机制实现进程互斥、同步、前驱关系
一.知识总览 二.信号量机制实现进程互斥 注意: 1.信号量mutex表示进入临界区的名额 2.对不同的临界资源需要设置不同的互斥信号量 3.P.V操作必须成对出现,缺少P(mutex)就不能保证临界 ...
- 【学习笔记】第二章——信号量机制 用信号量实现互斥、同步
文章目录 一. 信号量机制 整型信号量 记录型信号量 例子: 总结 二. 用信号量实现互斥.同步 互斥 同步 前驱 总结 一. 信号量机制 信号量:一个用于表示系统中某种资源的数量的变量(整数 or ...
- Linux内核信号量:二值信号量/互斥信号量,计数信号量,读写信号量
<semaphore信号量:一个简单的示例程序>用户态程序 目录 概念 应用场景 使用方法 内核信号量的构成 信号量的API 初始化 PV操作 获取信号量(P) 释放内核信号量(V) 补充 ...
- 【操作系统】进程管理(五)—— 信号量机制
[操作系统]进程管理(五)-- 信号量机制 前言 一.信号量机制 信号量机制--整型信号量 信号量机制--记录型信号量 二.用信号量机制实现进程互斥.同步.前驱关系 信号量机制实现进程互斥 信号量机制 ...
- 操作系统之信号量机制
一.信号量 百度百科:信号量(Semaphore)是在多线程环境下使用的一种设施,是可用来保证两个或者多个关键代码不被并发调用.在进入一个关键代码段之前,线程必须获取一个信号量:一旦关键代码段完成了, ...
- 五、深入了解信号量机制(大彻大悟篇)内附经典生产者消费者等线程同步问题
一.信号量机制 复习回顾+思考:之前学习的这些进程互斥的解决方案分别存在哪些问题? 进程互斥的四种软件实现方式(单标志法.双标志先检查.双标志后检查.Peterson算法 ) 进程互斥的三种硬件实现方 ...
最新文章
- 大连理工大学计算机原理实验交通灯,大连理工大学计算机原理第四次实验.docx...
- 【NLP】Task3:特征选择
- 数据湖技术 Iceberg 的探索与实践
- matlab 高分屏 变小,解决Ubuntu高分屏下matlab标题栏(菜单栏)字体过小问题
- 骗人的数学题,那消失的1块钱到底被谁拿走了
- python递归函数查询表_python---------------递归函数
- CortexM0开发 —— LPC11C14的UART使用方法
- java rpm包安装_rpm包安装java jar开机自启
- session 跟 cookie 关系
- webstorm激活破解方法大全
- jspstudy启动mysql失败_mysql服务启动失败解决方案
- [Qualcomm][MSM8937] MSM89XX平台上加载modem固件失败
- python for line in sys.stdin读文件,按行处理
- WIN7系统电脑关机后自动重启解决方法
- 北京妙计旅行 后台开发实习一面二面
- 开氏温度与摄氏度换算_【知识分享】柴油密度与温度的关系
- C++ 模板问题(一) -- 如何识别模板类型
- 推推客,拼多多优惠卷带你0投资月入过万
- 如何使用TPC-DS生成测试数据并导入MySQL
- 基于虚拟相机的人脸识别 (视频) - Face recognition based on virtual camera
热门文章
- struct和union的大小问题
- ATT与Intel汇编语言的比较
- C语言文件操作函数大全
- 【Qt】Qt项目常用代码总结
- antd 验证 动态 required_3分钟短文:十年窖藏,Laravel告诉你表单验证的正确姿势
- 如何打印网页版的发票_梦幻西游网页版:陷入瓶颈期,如何快速提升战力?氪金能解决问题...
- android 反编译_Box 黑科技——支持手机端反编译
- python接收输入的一行字符只统计数字的个数,Python(统计字符),python实例,输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数...
- python traceback安装_Python错误:Traceback (most recent call last):感觉是软件出了问题
- python3.8.5是python3吗_Python 升级到3.8.5