2010-11-11 13 views
83

Ich publiczne interfejsy są podobne. documentation stwierdza, że ​​SemaphoreSlim jest lekką alternatywą i nie używa semaforów jądra systemu Windows. This resource stwierdza, że ​​SemaphoreSlim jest znacznie szybszy. W jakich sytuacjach SemaphoreSlim ma więcej sensu nad Semafor i vice versa?Jak wybrać między Semaphore i SemaphoreSlim?

+0

Semafor zawsze przekazuje zadanie do systemu operacyjnego. To sprawia, że ​​jest stosunkowo kosztowne, jeśli semafor nie jest mocno zakwestionowany, koszt wywołania jądra wynosi 400 nanosekund. Szczupła przysługa najpierw próbuje zrobić to tanio ze wspólną zmienną, tylko wywołuje system operacyjny, kiedy to nie działa. Zawsze lubisz tanie, z wyjątkiem narożnego przypadku, w którym semafor musi być współdzielony przez wiele procesów. –

Odpowiedz

54

Jedna różnica polega na tym, że SemaphoreSlim nie zezwala na nazwy semaforów, które mogą mieć zasięg ogólnosystemowy. Oznaczałoby to, że SemaphoreSlim nie może być użyty do synchronizacji między procesami.

The MSDN documentation oznacza również, że SemSlim powinien być używany, gdy "oczekiwane czasy są bardzo krótkie". To zwykle dobrze pasuje do idei, że cienka wersja jest bardziej lekka dla większości transakcji.

+40

Chciałbym, aby MS napisało coś o tym, co dzieje się, gdy czasy oczekiwania nie są "bardzo krótkie". –

+43

...lub "bardzo krótki" oznacza –

+1

+1 dla dwóch komentarzy powyżej. czy ktoś może rzucić światło na "bardzo krótkie"? – Andy

15

The MSDN documentation opisuje różnicę.

W jednym zdaniu:

  • SemaphoreSlim klasa reprezentuje lekki, szybki semafora, który może być używany do czekania w ramach jednego procesu, gdy oczekuje się, że czas oczekiwania jest bardzo krótki.
+1

Aby dodać do tego, użyj SemaphoreSlim we wszystkich przypadkach, w których aplikacja jest jedynym procesem na twoim komputerze, który będzie potrzebował uzyskać dostęp do tego Semafora. – Salgat

+2

@Salgat Dlaczego miałbyś to zrobić? Jak opisano w innych odpowiedziach, 'SemaphoreSlim' jest zaimplementowany za pomocą SpinWait, więc jeśli czekasz na niego dużo, stracisz dużo czasu procesora. Co nie jest dobrym pomysłem, jeśli proces jest jedynym procesem na komputerze. –

+0

Z dokumentacji MSDN "Klasa SemaphoreSlim jest zalecanym semaforem do synchronizacji w ramach jednej aplikacji.". Z wyjątkiem specjalnych przypadków, powinieneś domyślnie używać SemaphoreSlim, jeśli tylko jeden proces używa tego semafora. Specjalne wyjątki zazwyczaj istnieją dla dowolnego typu współbieżnego danych, co jest oczywiste. – Salgat

7

Odnośnie „krótki czas” kontrowersja:

Przynajmniej SemaphoreSlim MSDN documentation stwierdza, że ​​

SemaphoreSlim klasa jest zalecana semafor do synchronizacji w obrębie jednej aplikacji.

w sekcji Uwagi. Sama sekcja mówi również główną różnicę między Semaphore i SemaphoreSlim:

SemaphoreSlim jest lekką alternatywą dla klasy semafora, który nie korzysta z semaforów jądra systemu Windows. W przeciwieństwie do klasy Semaphore, klasa SemaphoreSlim nie obsługuje nazwanych semaforów systemowych. Można go używać tylko jako lokalnego semafora.

+0

Więcej szczegółów: '[SemaphoreSlim i inne blokady] używają zajętego spinningu przez krótki czas, zanim wprowadzą wątek w prawdziwy stan Wait. Oczekuje się, że czas oczekiwania będzie bardzo krótki, wirowanie jest o wiele mniej kosztowne obliczeniowo niż oczekiwanie, co wiąże się z kosztownym przejściem jądra ": https://dotnet.github.io/docs/essentials/collections/thread-safe-collections.html –

5

SemaphoreSlim opiera się na SpinWait i monitor, więc wątku, który czeka, aby zdobyć zamek płonie cykli procesora na jakiś czas w nadziei zdobycia blokadę przed ulegania innym wątku. Jeśli tak się nie stanie, wątki pozwalają systemom przełączać kontekst i próbować ponownie (przez spalanie niektórych cykli procesora), gdy system operacyjny ponownie zaplanuje wątek. Przy długim oczekiwaniu ten wzorzec może przepalić znaczną ilość cykli procesora. Zatem scenariusz przypadku bestii dla takiej implementacji jest wtedy, gdy przez większość czasu nie ma czasu oczekiwania i prawie natychmiast można uzyskać blokadę.

Semafor opiera się na implementacji w jądrze systemu operacyjnego, więc za każdym razem, gdy zdobędziesz blokadę, zużywasz sporo cykli procesora, ale po tym wątku po prostu śpi tak długo, jak to konieczne, aby uzyskać blokadę.

Powiązane problemy