GCD之信号量机制二
来源:互联网 发布:怎么下载wps软件 编辑:程序博客网 时间:2024/05/21 09:56
在前面GCD之信号量机制一中介绍了通过信号量设置并行最大线程数,依此信号量还可以防止多线程访问公有变量时数据有误,下面的代码能说明。
1.下面是不采用信号量修改公有变量的值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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的信号量来开启线程修改公有变量时
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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关键字有一样的效果。
0 0
- GCD之信号量机制二
- ios GCD之信号量机制
- GCD之信号量机制一
- GCD(二) ---- dispatch_semaphore 信号量
- 进程间通信机制之二:信号量
- iOS系统GCD学习(5):信号量机制
- iOS系统GCD学习(5):信号量机制
- iOS系统GCD学习(5):信号量机制
- iOS系统GCD学习(5):信号量机制
- iOS系统GCD学习(5):信号量机制
- iOS系统GCD学习(5):信号量机制
- iOS系统GCD学习(5):信号量机制
- 操作系统之-----信号量机制
- iOS GCD之dispatch_semaphore(信号量)
- GCD 信号量
- GCD 信号量
- GCD之二:dispatch_queue_create
- swift之GCD(二)
- DFS(深搜)算法解析
- Codeforces 493D Vasya and Chess 题解
- Dell Dock 无法启动解决办法
- centos6 关于 ssh,svn,tomcat远程不能访问的问题处理过程
- 1037. 在霍格沃茨找零钱
- GCD之信号量机制二
- GCD之信号量机制一
- Ubuntu 14.04下怎么使用chroot创建另外一个系统
- Coursera ML笔记 -----week8-2 数据降维
- 101097B-思维,vector的resize和assign
- C#往线程里传递参数的方法小结
- 牛客网 有趣的排序
- GCD之线程挂起与恢复
- android 圆形头像 自定义ImageView