GCD 信号量控制并发 (dispatch_semaphore)
来源:互联网 发布:淘宝集市认可tm商标吗 编辑:程序博客网 时间:2024/04/25 14:37
当我们在处理一系列线程的时候,当数量达到一定量,在以前我们可能会选择使用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,根据这样的原理,我们便可以快速的创建一个并发控制来同步任务和有限资源访问控制。
信号量是一个整形值并且具有一个初始计数值,并且支持两个操作:信号通知和等待。当一个信号量被信号通知,其计数会被增加。当一个线程在一个信号量上等待时,线程会被阻塞(如果有必要的话),直至计数器大于零,然后线程会减少这个计数。
在GCD中有三个函数是semaphore的操作,分别是:
dispatch_semaphore_create 创建一个semaphore
dispatch_semaphore_signal 发送一个信号
dispatch_semaphore_wait 等待信号
简单的介绍一下这三个函数,第一个函数有一个整形的参数,我们可以理解为信号的总量,dispatch_semaphore_signal是发送一个信号,自然会让信号总量加1,dispatch_semaphore_wait等待信号,当信号总量少于0的时候就会一直等待,否则就可以正常的执行,并让信号总量-1,根据这样的原理,我们便可以快速的创建一个并发控制来同步任务和有限资源访问控制。
- dispatch_group_t group = dispatch_group_create();
- dispatch_semaphore_t semaphore = dispatch_semaphore_create(10);
- dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
- for (int i = 0; i < 100; i++)
- {
- dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
- dispatch_group_async(group, queue, ^{
- NSLog(@"%i",i);
- sleep(2);
- dispatch_semaphore_signal(semaphore);
- });
- }
- dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
- dispatch_release(group);
- dispatch_release(semaphore);
简单的介绍一下这一段代码,创建了一个初使值为10的semaphore,每一次for循环都会创建一个新的线程,线程结束的时候会发送一个信号,线程创建之前会信号等待,所以当同时创建了10个线程之后,for循环就会阻塞,等待有线程结束之后会增加一个信号才继续执行,如此就形成了对并发的控制,如上就是一个并发数为10的一个线程队列。
简单示例
- __block BOOL isok = NO;
- dispatch_semaphore_t sema = dispatch_semaphore_create(0);
- Engine *engine = [[Engine alloc] init];
- [engine queryCompletion:^(BOOL isOpen) {
- isok = isOpen;
- dispatch_semaphore_signal(sema);
- } onError:^(int errorCode, NSString *errorMessage) {
- isok = NO;
- dispatch_semaphore_signal(sema);
- }];
- dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
- dispatch_release(sema);
0 0
- GCD 信号量控制并发 (dispatch_semaphore)
- GCD 信号量控制并发 (dispatch_semaphore)
- GCD 信号量控制并发 (dispatch_semaphore)
- GCD 信号量控制并发 (dispatch_semaphore)
- GCD 信号量控制并发 (dispatch_semaphore)
- iOS --- GCD 信号量控制并发 (dispatch_semaphore)
- GCD 信号量控制并发(dispatch_semaphore)以及dispatch_group_async
- GCD 信号量控制并发(dispatch_semaphore)以及dispatch_group_async
- 利用GCD信号量(dispatch_semaphore)控制并发
- GCD信号量控制并发
- GCD 第四篇 dispatch_semaphore(信号量)
- iOS GCD之dispatch_semaphore(信号量)
- GCD dispatch_semaphore 信号量
- GCD(二) ---- dispatch_semaphore 信号量
- iOS控制高并发-dispatch_semaphore(信号量)的用法
- 完整详解GCD系列(四)dispatch_semaphore(信号量)
- 完整详解GCD系列(四)dispatch_semaphore(信号量)
- 完整详解GCD系列(四)dispatch_semaphore(信号量)
- 坑爹的ubuntu,自带的firefox浏览器居然只能以root权限使用。
- Xcode多渠道自动化打包
- R语言实现RMF模型
- spring mvc 前台向后台传递参数方法总结
- 车道偏离之透视变换
- GCD 信号量控制并发 (dispatch_semaphore)
- Java访问共享目录(samba和NFS配置及实现)
- 使用Shield保护ElasticSearch平台--兼权限控制
- for-switch-continue的嵌套使用问题。
- activeMQ4.1的JMX配置
- libsvm3.21在MATLAB2014a的安装应用之一:安装
- UIAlertView使用
- Nginx配置文件nginx.conf中文详解(总结)
- 用Matlab实现字符串分割(split)