GCD 信号量控制并发 (dispatch_semaphore)

当我们在处理一系列线程的时候,当数量达到一定量,在以前我们可能会选择使用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,根据这样的原理,我们便可以快速的创建一个并发控制来同步任务和有限资源访问控制。
[cpp]  view plain copy
  1. dispatch_group_t group = dispatch_group_create();   
  2.     dispatch_semaphore_t semaphore = dispatch_semaphore_create(10);   
  3.     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);   
  4.     for (int i = 0; i < 100; i++)   
  5.     {   
  6.         dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);   
  7.         dispatch_group_async(group, queue, ^{   
  8.             NSLog(@"%i",i);   
  9.             sleep(2);   
  10.             dispatch_semaphore_signal(semaphore);   
  11.         });   
  12.     }   
  13.     dispatch_group_wait(group, DISPATCH_TIME_FOREVER);   
  14.     dispatch_release(group);   
  15.     dispatch_release(semaphore);   

  简单的介绍一下这一段代码,创建了一个初使值为10的semaphore,每一次for循环都会创建一个新的线程,线程结束的时候会发送一个信号,线程创建之前会信号等待,所以当同时创建了10个线程之后,for循环就会阻塞,等待有线程结束之后会增加一个信号才继续执行,如此就形成了对并发的控制,如上就是一个并发数为10的一个线程队列。


简单示例

 

[cpp]  view plain copy
  1. __block BOOL isok = NO;  
  2.       
  3.     dispatch_semaphore_t sema = dispatch_semaphore_create(0);  
  4.     Engine *engine = [[Engine alloc] init];  
  5.     [engine queryCompletion:^(BOOL isOpen) {  
  6.         isok = isOpen;  
  7.         dispatch_semaphore_signal(sema);  
  8.     } onError:^(int errorCode, NSString *errorMessage) {  
  9.         isok = NO;  
  10.         dispatch_semaphore_signal(sema);  
  11.     }];  
  12.       
  13.     dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);  
  14.     dispatch_release(sema);  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值