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?
Odpowiedz
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.
Chciałbym, aby MS napisało coś o tym, co dzieje się, gdy czasy oczekiwania nie są "bardzo krótkie". –
...lub "bardzo krótki" oznacza –
+1 dla dwóch komentarzy powyżej. czy ktoś może rzucić światło na "bardzo krótkie"? – Andy
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.
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
@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. –
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
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.
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 –
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ę.
- 1. Binary Semaphore vs ReentrantLock
- 2. Python threading and semaphore
- 3. Jak wybrać tekst między dwoma węzłami?
- 4. Jak wybrać wszystkie godziny między dwiema datami?
- 5. Jak wybrać między mapą a mapą nieuporządkowaną?
- 6. Wybrać między stronami w Vimie?
- 7. Kiedy wybrać wtyczki i kiedy wybrać podpowiedź
- 8. doładowania pyton wybrać między przeciążonych metod
- 9. Jak wybrać między Cassandra, Membase, Hadoop, MongoDB, RDBMS itp?
- 10. Jak wybrać tekst między cudzysłowami, nawiasami ... w Emacs?
- 11. Jak wybrać między różnymi sposobami wykonywania wątków w Delphi?
- 12. Jak wybrać między dwoma liczbami losowo za pomocą javascript?
- 13. jak wybrać wszystkie i skopiować w vim?
- 14. Jak wybrać i zaktualizować w jednym zapytaniu?
- 15. Co to jest i jak wybrać typ zależności w project.json
- 16. różnica pomiędzy wybrać i gdzie w LINQ
- 17. Jak wybrać numer portu między komunikacją klienta i serwera w Internecie
- 18. OData - zagnieżdżone $ i $ wybrać poszerzyć
- 19. Jak wybrać, groupBy i dołączyć do Waterline lub MongoDB
- 20. Jak właściwie wybrać JButton
- 21. jak wybrać z DropDownList.text
- 22. Jak wybrać przycisk radiowy?
- 23. Jak wybrać UITextField?
- 24. co wybrać między wymaganiem a potwierdzeniem w scala
- 25. Jak wybrać MAX (data)?
- 26. Jak programowo wybrać kartę?
- 27. Jak wybrać wiązanie WCF?
- 28. różnice między scipy.sparse.linalg.lsmr i scipy.sparse.linalg.lsqr
- 29. Różnica między ngStorage i $ window.localStorage
- 30. git cherry-wybrać różnicę między commitami bez wspólnej historii?
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. –