GCD如何实现最大并发数呢?

前言

大家都知道对于NSOperationQueue队列来说,要实现最大并发数是比较轻而易举的事,只需要设置它的属性maxConcurrentOperationCount就可以办到。

 //创建一个队列(非主队列)
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

//设置最大并发量(最多同时执行10个任务)
queue.maxConcurrentOperationCount = 10;

对GCD而,只有靠自己想方法处理

GCD可以用信号量semaphore来实现,费话不多说,直接上代码

//建立任务组
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++) {

      //semphore值为0时会一直等待执行。当>=1时执行下面的代码。可通过一次,会将semphore的值减1.
      dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

      //监视queue队列
      dispatch_group_async(group, queue, ^{

            NSLog(@"这里在执行耗时操作----%i",i);
            sleep(2);

            //当前线程执行完成后,使semaphore的值加1,这样,如果semphore的值就加1,会触发dispatch_semaphore_wait执行一条代码
            dispatch_semaphore_signal(semaphore);    
     });
 }


//永远地监听Group中的任务是否执行完成。
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

关于信号量的一些深刻的理解,可以察看 fhbystudy的分享,也谢谢他的分享!