在前面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之信号量机制二相关推荐

  1. 二、操作系统——用信号量机制实现进程互斥、同步、前驱关系(详解)

    一.什么是进程同步? 二.什么是进程互斥? 临界资源:一个时间段内只允许一个进程使用的资源 为了实现对临界资源的互斥访问,同时保证系统整体性能,需要遵循以下原则: 空闲让进.临界区空闲时,可以允许一个 ...

  2. 操作系统(二十二)用信号量机制实现进程互斥、同步、前驱关系

    2.3.5 用信号量机制实现进程互斥.同步.前驱关系 目录 2.3.5 用信号量机制实现进程互斥.同步.前驱关系 2.3.5.1 用信号量机制实现进程互斥 2.3.5.2 用信号量机制实现进程同步 2 ...

  3. 操作系统(二十一)信号量机制

    2.3.4 信号量机制 在前两节中我们分别学习了用软件方式以及硬件方式实现互斥访问,但是他们或多或少的存在一些问题,1965年荷兰的一名学者迪杰斯特拉(是的,就是那个男人)提出了信号量机制,有效的解决 ...

  4. 十六、用信号量机制实现进程互斥、同步、前驱关系

    一.知识总览 二.信号量机制实现进程互斥 注意: 1.信号量mutex表示进入临界区的名额 2.对不同的临界资源需要设置不同的互斥信号量 3.P.V操作必须成对出现,缺少P(mutex)就不能保证临界 ...

  5. 【学习笔记】第二章——信号量机制 用信号量实现互斥、同步

    文章目录 一. 信号量机制 整型信号量 记录型信号量 例子: 总结 二. 用信号量实现互斥.同步 互斥 同步 前驱 总结 一. 信号量机制 信号量:一个用于表示系统中某种资源的数量的变量(整数 or ...

  6. Linux内核信号量:二值信号量/互斥信号量,计数信号量,读写信号量

    <semaphore信号量:一个简单的示例程序>用户态程序 目录 概念 应用场景 使用方法 内核信号量的构成 信号量的API 初始化 PV操作 获取信号量(P) 释放内核信号量(V) 补充 ...

  7. 【操作系统】进程管理(五)—— 信号量机制

    [操作系统]进程管理(五)-- 信号量机制 前言 一.信号量机制 信号量机制--整型信号量 信号量机制--记录型信号量 二.用信号量机制实现进程互斥.同步.前驱关系 信号量机制实现进程互斥 信号量机制 ...

  8. 操作系统之信号量机制

    一.信号量 百度百科:信号量(Semaphore)是在多线程环境下使用的一种设施,是可用来保证两个或者多个关键代码不被并发调用.在进入一个关键代码段之前,线程必须获取一个信号量:一旦关键代码段完成了, ...

  9. 五、深入了解信号量机制(大彻大悟篇)内附经典生产者消费者等线程同步问题

    一.信号量机制 复习回顾+思考:之前学习的这些进程互斥的解决方案分别存在哪些问题? 进程互斥的四种软件实现方式(单标志法.双标志先检查.双标志后检查.Peterson算法 ) 进程互斥的三种硬件实现方 ...

最新文章

  1. 大连理工大学计算机原理实验交通灯,大连理工大学计算机原理第四次实验.docx...
  2. 【NLP】Task3:特征选择
  3. 数据湖技术 Iceberg 的探索与实践
  4. matlab 高分屏 变小,解决Ubuntu高分屏下matlab标题栏(菜单栏)字体过小问题
  5. 骗人的数学题,那消失的1块钱到底被谁拿走了
  6. python递归函数查询表_python---------------递归函数
  7. CortexM0开发 —— LPC11C14的UART使用方法
  8. java rpm包安装_rpm包安装java jar开机自启
  9. session 跟 cookie 关系
  10. webstorm激活破解方法大全
  11. jspstudy启动mysql失败_mysql服务启动失败解决方案
  12. [Qualcomm][MSM8937] MSM89XX平台上加载modem固件失败
  13. python for line in sys.stdin读文件,按行处理
  14. WIN7系统电脑关机后自动重启解决方法
  15. 北京妙计旅行 后台开发实习一面二面
  16. 开氏温度与摄氏度换算_【知识分享】柴油密度与温度的关系
  17. C++ 模板问题(一) -- 如何识别模板类型
  18. 推推客,拼多多优惠卷带你0投资月入过万
  19. 如何使用TPC-DS生成测试数据并导入MySQL
  20. 基于虚拟相机的人脸识别 (视频) - Face recognition based on virtual camera

热门文章

  1. struct和union的大小问题
  2. ATT与Intel汇编语言的比较
  3. C语言文件操作函数大全
  4. 【Qt】Qt项目常用代码总结
  5. antd 验证 动态 required_3分钟短文:十年窖藏,Laravel告诉你表单验证的正确姿势
  6. 如何打印网页版的发票_梦幻西游网页版:陷入瓶颈期,如何快速提升战力?氪金能解决问题...
  7. android 反编译_Box 黑科技——支持手机端反编译
  8. python接收输入的一行字符只统计数字的个数,Python(统计字符),python实例,输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数...
  9. python traceback安装_Python错误:Traceback (most recent call last):感觉是软件出了问题
  10. python3.8.5是python3吗_Python 升级到3.8.5