Ihre öffentlichen Schnittstellen sehen ähnlich aus. In der Dokumentation heißt es, dass SemaphoreSlim eine einfache Alternative ist und keine Windows-Kernel-Semaphoren verwendet. Diese Ressource gibt an, dass das SemaphoreSlim viel schneller ist. In welchen Situationen ist das SemaphoreSlim gegenüber dem Semaphore sinnvoller und umgekehrt?
c#
multithreading
semaphore
Michael Hedgpeth
quelle
quelle
Antworten:
Ein Unterschied besteht darin, dass
SemaphoreSlim
keine benannten Semaphoren zulässig sind, die systemweit sein können. Dies würde bedeuten, dass ein SemaphoreSlim nicht für die prozessübergreifende Synchronisation verwendet werden kann.In der MSDN-Dokumentation wird auch angegeben, dass SemSlim verwendet werden sollte, wenn "Wartezeiten voraussichtlich sehr kurz sind". Das passt normalerweise gut zu der Idee, dass die schlanke Version für die meisten Kompromisse leichter ist.
quelle
Die MSDN-Dokumentation beschreibt den Unterschied.
In einem Satz:
quelle
SemaphoreSlim
wird es mit SpinWait implementiert. Wenn Sie also viel darauf warten, verschwenden Sie viel CPU-Zeit. Was nicht einmal eine gute Idee ist, wenn Ihr Prozess der einzige Prozess auf dem Computer ist.SemaphoreSlim basiert auf SpinWait und Monitor, sodass der Thread, der darauf wartet, die Sperre zu erhalten, einige Zeit CPU-Zyklen brennt, in der Hoffnung, die Sperre zu erhalten, bevor er einem anderen Thread nachgibt. Wenn dies nicht der Fall ist, können die Systeme mithilfe des Threads den Kontext wechseln und versuchen es erneut (durch Brennen einiger CPU-Zyklen), sobald das Betriebssystem diesen Thread erneut plant. Bei langen Wartezeiten kann dieses Muster eine erhebliche Anzahl von CPU-Zyklen durchbrennen. Das beste Szenario für eine solche Implementierung ist also, wenn die meiste Zeit keine Wartezeit besteht und Sie die Sperre fast sofort erhalten können.
Semaphore basiert auf der Implementierung im Betriebssystemkern. Jedes Mal, wenn Sie die Sperre erwerben, verbringen Sie eine Menge CPU-Zyklen, aber danach schläft der Thread einfach so lange wie nötig, um die Sperre zu erhalten.
quelle
In Bezug auf "kurze Zeiten" Kontroverse:
Zumindest die MSDN-Dokumentation von SemaphoreSlim besagt dies
im Abschnitt Bemerkungen. Im selben Abschnitt wird auch der Hauptunterschied zwischen Semaphore und SemaphoreSlim erläutert:
quelle
[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/...Ich habe mir hier den Quellcode angesehen und mir Folgendes ausgedacht:
Sowohl Semaphore als auch SemaphoreSlim stammen von WaitHandle, das intern das native Win32-Handle verwendet. Aus diesem Grund müssen Sie beide entsorgen (). Die Vorstellung, dass Slim leicht ist, ist also verdächtig.
SemaphoreSlim verwendet SpinWait intern, Semaphore jedoch nicht. Das sagt mir, dass Semaphore in Fällen, in denen eine lange Wartezeit erwartet wird, zumindest in dem Sinne besser abschneiden sollte, dass es Ihre CPU nicht erstickt.
quelle