142 votes

Sémaphore - Quelle est l'utilité du comptage initial ?

http://msdn.microsoft.com/en-us/library/system.threading.semaphoreslim.aspx

Pour créer un sémaphore, je dois fournir un nombre initial et un nombre maximal. MSDN indique qu'un compte initial est -

Le nombre initial de demandes de qui peuvent être accordées simultanément.

Bien qu'il soit indiqué que le nombre maximum est de

Le nombre maximum de demandes pour le qui peuvent être accordées simultanément.

Je comprends que le nombre maximum est le nombre maximum de threads qui peuvent accéder simultanément à une ressource, mais à quoi sert le nombre initial ?

Si je crée un sémaphore avec un nombre initial de 0 et un nombre maximal de 2, aucun de mes threads ne peut accéder à la ressource. Si je fixe le nombre initial à 1 et le nombre maximum à 2, seul un thread du pool de threads peut accéder à la ressource. Ce n'est que lorsque je fixe le compte initial et le compte maximum à 2 que 2 threads peuvent accéder à la ressource simultanément. Je ne comprends donc pas très bien l'importance du nombre initial.

SemaphoreSlim semaphoreSlim = new SemaphoreSlim(0, 2); //all threadpool threads wait
SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1, 2);//only one thread has access to the resource at a time
SemaphoreSlim semaphoreSlim = new SemaphoreSlim(2, 2);//two threadpool threads can access the resource concurrently

2voto

Erno de Weerd Points 30391

Ainsi, lorsque le thread en cours crée le sémaphore, il peut réclamer certaines ressources dès le départ.

2voto

jitbit Points 8072

Pensez-y de la manière suivante :

  • initialCount est le "degré de parallélisme" (nombre de threads pouvant entrer)
  • maxCount garantit que vous n'avez pas Release plus que vous ne le devriez

Par exemple, supposons que vous souhaitiez un degré de concurrence de "1" (une seule opération à la fois). Mais à cause d'un bug dans votre code, vous libérez le sémaphore deux fois. Vous avez donc un degré de simultanéité de deux !

Mais si vous définissez maxCount - il ne l'autorisera pas et lèvera une exception.

0voto

maxCount est le nombre de threads simultanés que vous allez autoriser.

Cependant, lorsque vous commencez la limitation, vous pouvez déjà savoir qu'il y a quelques fils de discussion actifs, vous voudrez donc lui dire "hey, je veux avoir 6 fils de discussion simultanés, mais j'en ai déjà 4, donc je veux que vous n'en autorisiez que 2 de plus pour l'instant", donc vous mettrez initialCount à 2 et maxCount à 6.

La limite de la initialCount en SemaphoreSlim est qu'il ne peut s'agir d'un nombre négatif, de sorte que vous ne pouvez pas dire "hé, je veux avoir jusqu'à 6 threads simultanés, mais j'en ai actuellement 10, alors laissez 5 se libérer avant d'en autoriser un autre". Cela signifierait un initialCount de -4. Pour cela, vous devez utiliser un logiciel tiers comme SémaphoreSlimThrottling (je suis l'auteur de SemaphoreSlimThrottling).

-1voto

Irfan Points 308

En tant que MSDN l'explique dans la section Remarques :

Si initialCount est inférieur à maximumCount, l'effet est le même que si le thread actuel avait appelé WaitOne (maximumCount moins initialCount) plusieurs fois. Si vous ne souhaitez pas réserver d'entrées pour le thread qui crée le sémaphore, utilisez le même nombre pour maximumCount et initialCount.

Ainsi, si le compte initial est de 0 et que le maximum est de 2, c'est comme si WaitOne avait été appelé deux fois par le thread principal, de sorte que nous avons atteint la capacité (le compte du sémaphore est de 0 maintenant) et qu'aucun thread ne peut entrer dans le sémaphore. De même, si le nombre initial est de 1 et que le maximum est de 2, WaitOnce a été appelé une fois et un seul thread peut entrer dans le sémaphore avant que la capacité ne soit à nouveau atteinte, et ainsi de suite.

Si 0 est utilisé pour le décompte initial, nous pouvons toujours appeler Release(2) pour augmenter le décompte des sémaphores à max afin de permettre à un nombre maximum de threads d'acquérir la ressource.

-1voto

rism Points 2864

Les sémaphores peuvent être utilisés pour protéger un ensemble de ressources. . Nous utilisons des pools de ressources pour réutiliser les choses qui sont coûteux à créer - comme les connexions aux bases de données.

Le nombre initial fait donc référence au nombre de ressources disponibles dans le pool au moment de l'entrée en vigueur de l'accord. début d'un processus. Lorsque vous lisez le initialCount dans le code, vous devriez réfléchir à l'effort initial que vous déployez pour créer cette réserve de ressources.

Je ne comprends pas très bien la signification du décompte initial.

Initial count = Upfront cost

Ainsi, en fonction du profil d'utilisation de votre application, cette valeur peut avoir un effet considérable sur les performances de votre application. Il ne s'agit pas d'un simple chiffre arbitraire.

Vous devez bien réfléchir à ce que vous créez, au coût de leur création et au nombre dont vous avez besoin immédiatement. Vous devriez littéralement être en mesure de représenter graphiquement la valeur optimale de ce paramètre et envisager de le rendre configurable afin d'adapter les performances du processus au moment où il est exécuté.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X