我想了很久还是没明白。initialCount和 和有什么区别maximumCount?负责什么?maximumCount如果initialCount这是同时运行的最大线程数,为什么会这样?和类似的问题。
我的理解是initialCount它负责同时运行的线程数量,maximumCount但不清楚。
我在某处读到:
initialCount负责通话次数WaitOne(),a-maximumCount负责通话次数Release()。
这是事情变得更加不清楚的地方。
一般来说,如果有人充分解释他们的职责,我将不胜 initialCount感激maximumCount。
信号量有一个内部计数器,用于显示信号量控制的当前对象数量(例如,正在运行的线程数量)。
如果您在创建信号量时指定
initialCount =0,则信号量处于繁忙状态。如果您现在启动等待信号量的线程,它们将会阻塞。为了使信号量进入有信号状态,您需要
ReleaseSemaphore使用所需的 number来执行n。在这种情况下,信号量计数器变得等于n。如果
ReleaseSemaphore传输的数字太大,使得总数текущий счётчик + release超过MaximumCount,则当前计数器不改变当信号量进入有信号状态,并且有线程在等待该信号量时,每个线程(不超过
n)从 Wait 函数成功返回;每成功一次 Wait,信号量计数器就会减 1。如果n有多个等待对象,则计数器重置为零,信号量进入繁忙状态,并且额外的线程继续等待。当一个线程终止时,它(通常)应该被调用
ReleaseSemaphore(1),并且计数器加一;信号量向下一个等待对象发出信号。请注意,您可以创建一个非零的信号量
initialCount,然后它立即准备好运行适当数量的线程一般来说,所有内容都在文档中写得很清楚,甚至在初始计数器小于最大值时给出了示例。原则上,它们已经有了不言自明的名称。
您只需考虑几个不同的用例即可清楚地了解为什么需要它
initialCount以及为什么它可能与maximumCount.案件
initialCount == maximumCount。这是信号量的典型用途。这里有一个特定的“瓶颈”:您想要运行的最大线程数、某些服务允许的最大同时登录数等等。并且您不希望任何程序进程超过此最大值。您初始化一个信号量,它的两个计数器都等于该最大值。在入口处,他从计数器中减去,在出口处,他将其加回来。最重要的是,当当前信号量计数器达到零时,对函数的新调用将被阻止,等待计数器变得大于零。通过这种方式,您可以限制函数的最大条目数,并且某些实体的复制不会超过某个最大值。案件
initialCount < maximumCount。这几乎是相同的事情,但是您希望对进程有更多的控制,并且不希望立即达到最大进程数。一个极端的情况是initialCount = 0,在这种情况下,根本不会启动任何进程,所有进程都将被阻塞在信号量上。也许你想等待一些事情,之后你可以立即或逐渐增加计数器最大值和初始值之间的差异,然后信号量将像第一种情况一样起作用。例如,您想要逐渐增加负载,为此,您可以在一定延迟的情况下多次增加计数器。事实证明,第一个进程可以启动,然后是两个,依此类推,直到最大值。一般来说,当需要的时候你可以想出一些场景。