Jaka jest różnica między obiektami zdarzeń a zmiennymi warunku? Pytam w kontekście WIN32 API.Różnica między obiektem zdarzenia a zmienną warunku
Odpowiedz
Obiekty zdarzeń są obiektami poziomu jądra. Mogą być współdzielone przez granice procesów i są obsługiwane we wszystkich wersjach systemu operacyjnego Windows. Mogą być używane jako samodzielne zamki do współdzielonych zasobów, w razie potrzeby. Ponieważ są to obiekty jądra, system operacyjny ma ograniczenia dotyczące liczby dostępnych zdarzeń, które mogą być przydzielane na raz.
Zmienne warunku są obiektami na poziomie użytkownika. Nie można ich udostępniać między granicami procesowymi i są obsługiwane tylko w systemach Vista/2008 i nowszych. Nie działają one jak własne zamki, ale wymagają osobnego zamka, który zostanie z nimi powiązany, na przykład sekcji krytycznej. Ponieważ są obiektami użytkownika, liczba dostępnych zmiennych jest ograniczona dostępną pamięcią. Po uśpieniu zmiennej warunkowej automatycznie zwalnia określony obiekt blokady, aby mógł go uzyskać inny wątek. Gdy Zmienna warunkowa się obudzi, automatycznie ponownie odzyska podany obiekt blokady.
Pod względem funkcjonalności, myśl o zmiennej warunkowej jako logicznej kombinacji dwóch obiektów pracujących razem - obiektu keyed event i obiektu blokady. Po ustawieniu zmiennej stanu w stan uśpienia resetuje zdarzenie, zwalnia blokadę, czeka na sygnalizację zdarzenia, a następnie ponownie odzyskuje blokadę. Na przykład, jeśli jako obiekt blokady używana jest sekcja krytyczna, SleepConditionalVariableCS()
jest podobna do sekwencji wywołań do ResetEvent()
, LeaveCriticalSection()
, WaitForSingleObject()
i EnterCriticalSection()
. Natomiast jeśli używasz SRWL jako blokady, SleepConditionVariableSRW()
jest podobna do sekwencji wywołań do ResetEvent()
, ReleaseSRWLock...()
, WaitForSingleObject()
i AcquireSRWLock...()
.
Są bardzo podobne, ale obiekty zdarzeń działają ponad granicami procesu, natomiast zmienne warunkowe nie. Od MSDN documentation on condition variables:
Stan zmienne są w trybie użytkownika obiekty, które nie mogą być współużytkowane przez procesów.
Z MSDN documentation on event objects:
Tematy na innych procesów można otworzyć uchwyt do istniejącego obiektu zdarzenia przez podając jej nazwę w wywołaniu funkcji OpenEvent.
Nie, Remy Lebeau jest bliższy prawdy. Warunek Zmienna to coś, co zostało niedawno zaimportowane z systemu Unix do systemu Windows. Obiekt zdarzenia to blada imitacja warunku.W rzeczywistości nietrywialne jest zaimplementowanie warunku Var tylko w przypadku obiektów Event i Mutex. Zobacz http://www.cse.wustl.edu/~schmidt/win32-cv-1.html – Arkadiy
Najbardziej znaczącą różnicą jest to, że obiekt Event jest obiektem jądra i może być współdzielony pomiędzy procesami, o ile jest żywy, gdy procesy/wątki próbują uzyskać, przeciwnie, zmienna Condition jest obiektem trybu użytkownika, który jest światło (ma tylko taki sam rozmiar jak wskaźnik i nie ma nic, co mogłoby zostać wydane po jego użyciu) i ma lepszą wydajność.
Zazwyczaj zmienna warunkowa jest często używana wraz z blokadami, ponieważ musimy odpowiednio synchronizować dane. Rozważając Warunkowe Zmienne, traktujemy to jak kluczowe zdarzenia, które poprawiły się od Visty.
Joe duffy ma wpis na blogu http://joeduffyblog.com/2006/11/28/windows-keyed-events-critical-sections-and-new-vista-synchronization-features/, który wyjaśnił bardziej szczegółowe informacje.
- 1. Różnica między obiektem a *?
- 2. Kotlin: Różnica między obiektem a obiektem towarzyszącym w klasie
- 3. Jaka jest różnica między zmienną a podwójną?
- 4. Konwersja między obiektem Pillow Image a zmienną numpy array Wymiar
- 5. Jaka jest różnica między zmienną x [] a zmienną [] x?
- 6. Jaka jest różnica między zmienną składową a zmienną lokalną?
- 7. Różnica między zmienną a zmienną get w TensorFlow
- 8. Jaka jest różnica między setattr() a obiektem .__ setattr __()?
- 9. Jaka jest różnica między modelem widoku a obiektem przesyłania danych?
- 10. Różnica między wielowymiarowymi zapisami w tablicy (obiekt [] [] a obiektem [,])
- 11. Jaka jest różnica między obiektem modelu MVC, obiektem domeny a DTO
- 12. Różnica między obiektem obj.create() a obiektem obj.Show() w porównaniu z obj.create(). Show()
- 13. Różnica między tablicą i obiektem w js?
- 14. Jaka jest różnica między właściwością System a zmienną środowiskową
- 15. Jaka jest różnica między stałą statyczną a zmienną constexpr?
- 16. Jaka jest różnica między symbolem a zmienną w Ruby?
- 17. Różnica między prywatnym EventHandler a prywatnym EventHandler zdarzenia?
- 18. Różnica między jquery a $
- 19. Różnica między bip pid a $$
- 20. Różnica między definiowaniem zmiennej jako var $ a = $() i var a?
- 21. Jaka jest różnica między ramką a ramką?
- 22. jaka jest różnica między: %% a% zmiennymi% zmiennych?
- 23. W programie Robot Framework, jaka jest różnica między zmienną listową a zmienną skalarną zawierającą listę?
- 24. Różnica między zdarzeniem OnClick() a OnClickListener?
- 25. Różnica między String [] a i String ... a
- 26. Różnica między ładowaniem klasy a jej instancją
- 27. Jaka jest różnica między "$ zmienną" i "zmienną" - JavaScript - jQuery
- 28. Różnica między kodowaniem a sortowaniem?
- 29. Różnica między onbeforeunload a onunload
- 30. Różnica między OpenCV a OpenCL
Nie rozumiem, jeśli CS zawiera zdarzenie wewnątrz niego, to jak możesz twierdzić, że jest ograniczona przez dostępną pamięć zamiast liczby dostępnych zdarzeń w systemie? – Mehrdad
Nie powiedziałem, że CS zawiera obiekt zdarzenia * RZECZYWISTY *, ale powiedziałem, że "technicznie rzecz biorąc, to nie jest to, co Warunkowa zmienna faktycznie robi wewnętrznie", IOW to tylko AKTYWA, ponieważ używa zdarzenia, ale prawdopodobnie nie . Szczegóły, w jaki sposób CS czeka, są prywatne do wdrożenia systemu operacyjnego. W przypadku 'SleepConditionVariableCS()', na przykład, bardziej prawdopodobne jest użycie 'SleepEx()' i obudzony przez timeout lub APC z 'WakeConditionVariable()'. Zaktualizowałem odpowiedź, aby to odzwierciedlić. –
Po przeczytaniu odpowiedzi walkingbeara, implementacja prawdopodobnie używa [zdarzenia kluczowego] (http://joeduffyblog.com/2006/11/28/windows-keyed-events-critical-sections-and-new-vista-synchronization-features /) jako obiekt oczekiwania. W ten sposób wiele CS-ów używa współdzielenia pojedynczego obiektu zdarzenia jądra, który jest zawsze dostępny i można go osobno oczekiwać przez osobne wątki. –