博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GCD之信号量机制二
阅读量:6502 次
发布时间:2019-06-24

本文共 1672 字,大约阅读时间需要 5 分钟。

在前面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关键字有一样的效果。

转载地址:http://uyxyo.baihongyu.com/

你可能感兴趣的文章
测试用例出错重跑--flaky插件
查看>>
yaf的安装
查看>>
比较java与C++的不同
查看>>
Twitter Storm入门
查看>>
使用scikit-learn进行文本分类
查看>>
Ansible自动化运维配置与应用(结合实例)
查看>>
下面简要介绍软件工程的七条原理
查看>>
java POI实现excel实现表格导出
查看>>
Lua(三)——语句
查看>>
TensorFlow的基本运算01
查看>>
怎么看电脑有没有安装USB3.0驱动
查看>>
overflow清除浮动的原理
查看>>
Spring Boot 使用parent方式引用时 获取值属性方式默认@
查看>>
解决maven下载jar慢的问题(如何更换Maven下载源)
查看>>
linux安装gitLab
查看>>
concurrent包的实现示意图
查看>>
golang os.Args
查看>>
Linux常用命令
查看>>
spring-data-elasticsearch 概述及入门(二)
查看>>
Solr启动和结束命令
查看>>