2009-07-31 13 views

Odpowiedz

21

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...().

+0

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

+0

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ć. –

+0

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. –

2

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.

+6

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

1

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.

Powiązane problemy