web-dev-qa-db-fra.com

Comment choisir entre Semaphore et SemaphoreSlim?

Leurs interfaces publiques semblent similaires. documentation indique que SemaphoreSlim est une alternative légère et n'utilise pas de sémaphores du noyau Windows. Cette ressource indique que SemaphoreSlim est beaucoup plus rapide. Dans quelles situations le SemaphoreSlim a-t-il plus de sens par rapport au Semaphore et vice versa?

97
Michael Hedgpeth

Une différence est que SemaphoreSlim ne permet pas les sémaphores nommés, qui peuvent être à l'échelle du système. Cela signifierait qu'un SemaphoreSlim ne pourrait pas être utilisé pour la synchronisation inter-processus.

La documentation MSDN indique également que SemSlim doit être utilisé lorsque "les temps d'attente devraient être très courts". Cela s'accorderait généralement bien avec l'idée que la version slim est plus légère pour la plupart des compromis.

60
Andrew Barber

La documentation MSDN décrit la différence.

En une phrase:

  • La classe SemaphoreSlim représente un sémaphore léger et rapide qui peut être utilisé pour attendre dans un seul processus lorsque les temps d'attente devraient être très courts.
16
Joe

SemaphoreSlim est basé sur SpinWait et Monitor, donc le thread qui attend pour acquérir le verrou brûle les cycles CPU pendant un certain temps dans l'espoir d'acquérir le verrou avant de céder à un autre thread. Si cela ne se produit pas, les threads permettent aux systèmes de changer de contexte et essaient à nouveau (en brûlant certains cycles de processeur) une fois que le système d'exploitation planifie à nouveau ce thread. Avec de longues attentes, ce modèle peut brûler une quantité substantielle de cycles CPU. Ainsi, le meilleur scénario pour une telle implémentation est lorsque la plupart du temps il n'y a pas de temps d'attente et que vous pouvez presque instantanément acquérir le verrou.

Semaphore s'appuie sur l'implémentation dans le noyau du système d'exploitation, donc chaque fois que vous acquérez le verrou, vous passez beaucoup de cycles CPU, mais après cela, le thread dort simplement aussi longtemps que nécessaire pour obtenir le verrou.

11
Dmytro Zakharov

Concernant la controverse sur les "courts délais":

Au moins documentation MSDN SemaphoreSlim indique que

La classe SemaphoreSlim est le sémaphore recommandé pour la synchronisation dans une seule application.

dans la section Remarques. La même section indique également la principale différence entre Semaphore et SemaphoreSlim:

SemaphoreSlim est une alternative légère à la classe Semaphore qui n'utilise pas de sémaphores du noyau Windows. Contrairement à la classe Semaphore, la classe SemaphoreSlim ne prend pas en charge les sémaphores système nommés. Vous pouvez l'utiliser uniquement comme sémaphore local.

8
Shaedar

J'ai regardé le code source ici et voici ce que j'ai trouvé:

  1. Semaphore et SemaphoreSlim dérivent de WaitHandle qui utilise en interne le handle natif Win32. C'est pourquoi vous devez disposer des deux (). La notion que Slim est léger est donc suspecte.

  2. SemaphoreSlim utilise SpinWait en interne, contrairement à Semaphore. Cela me dit que dans les cas où l'attente devrait être longue, Semaphore devrait faire mieux au moins dans le sens où il ne suffoquera pas votre CPU.

0
ILIA BROUDNO