iOS 多线程开发GCD如何控制最大并发数

2025-05-05 05:33:04
推荐回答(2个)
回答(1):

创建信号量的方式:
(1)dispatch_semaphore_creat SignalCount = dispatch_semaphore_creat(10).
这个地方后面的这个10,是一个整数,可以是1,2,3,。。。表示在信号等待的时候,下一次收到的的信号量,说白了,就是这个数字控制的最大并发数。
(2)dispatch_semaphore_signal( ),这是一句表示信号通知。表示在信号等待的时候,收到的下一个信号量。一般是一个“信号量对象”。
(3)dispatch_semaphore_wait(参数一,参数二 ),这一句表示信号等待。
一般参数一会放一个信号对象,就是我们建立的那个,如果这个对列的信号量小于0的时候,就会一直等待下去。
参数二的值一般是 DISPATCH_TIME_FOREVER 和 DISPATCH_TIME_NOW

下面我们写一段代码来说明一下。(注:当然是参考别人的)

这个地方,解释一下,新建一个信号量为10的对象,就是将队列的最大并发数控制在10。
第一次打印的结果是 0,1,2,3,4,5,6,7,8,9。十个数字。
最关键的是dispatch_semaphore_signal(semphore),如果打印完第一轮十个数字,不再进行信号通知的话,线程就永远阻塞下去咯。剩下的10~99就不会再打印下去。
(注:以上是看了一个大神地思路以后,自己摆弄了一下,然后给大家解释一下,感谢那位大神,有些公司去面试的时候,会问NSOperation这个类通过调用setMaxConcurrentOperationCount这个方法设置最大的并发数,多线程技术GCD可以吗?答案是可以的,还有之前看过另外一个大神的,通过信号量控制,将异步的线程变成同步线程的,有兴趣的同学可以去参阅以下)。

回答(2):

GCD是一套C语言的API,所以没有什么属性控制最大并发量,用dispatch_semaphore_t(信号量)来实现。

信号量定义:

  1. 信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。

  2. 在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。