Leurs interfaces publiques semblent similaires. La documentation indique que SemaphoreSlim est une alternative légère et n'utilise pas de sémaphores du noyau Windows. Cette ressource indique que le SemaphoreSlim est beaucoup plus rapide. Dans quelles situations le SemaphoreSlim a-t-il plus de sens sur le Sémaphore et vice versa?
c#
multithreading
semaphore
Michael Hedgpeth
la source
la source
Réponses:
Une différence est que cela
SemaphoreSlim
n'autorise 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 sont censés être très courts». Cela cadrerait généralement bien avec l'idée que la version mince est plus légère pour la plupart des compromis.
la source
La documentation MSDN décrit la différence.
En une phrase:
la source
SemaphoreSlim
est implémenté à l'aide de SpinWait, donc si vous attendez beaucoup, vous perdrez beaucoup de temps CPU. Ce n'est même pas une bonne idée si votre processus est le seul processus sur l'ordinateur.SemaphoreSlim est basé sur SpinWait et Monitor, donc le thread qui attend d'acquérir le verrou brûle des 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. Le meilleur scénario pour une telle implémentation est donc lorsque la plupart du temps, il n'y a pas de temps d'attente et que vous pouvez acquérir presque instantanément le verrou.
Semaphore repose sur l'implémentation dans le noyau du système d'exploitation, donc chaque fois que vous acquérez le verrou, vous passez pas mal de cycles CPU, mais après cela, le thread dort simplement aussi longtemps que nécessaire pour obtenir le verrou.
la source
Concernant la controverse sur les «temps courts»:
Au moins la documentation de SemaphoreSlim MSDN indique que
dans la section Remarques. La même section indique également la principale différence entre Semaphore et SemaphoreSlim:
la source
[SemaphoreSlim and other locks] use busy spinning for brief periods before they put the thread into a true Wait state. When wait times are expected to be very short, spinning is far less computationally expensive than waiting, which involves an expensive kernel transition
: dotnet.github.io/docs/essentials/collections/...J'ai regardé le code source ici et c'est ce que j'ai trouvé:
Semaphore et SemaphoreSlim dérivent de WaitHandle qui utilise en interne le handle natif Win32. C'est pourquoi vous devez utiliser Dispose () à la fois. Donc, l'idée que Slim est léger est suspecte.
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 n'étouffera pas votre CPU.
la source