Obiekty semaphore
Obiekt semafora jest obiektem synchronizacji, który utrzymuje liczbę z przedziału od zera do określonej maksymalnej wartości. Liczba jest dekrementowana za każdym razem, gdy wątek kończy oczekiwanie na obiekt semafora i zwiększa się za każdym razem, gdy wątek zwalnia semafor. Gdy liczba osiągnie zero, nie więcej wątków może pomyślnie poczekać, aż stan obiektu semafora zostanie zasygnalizowany. Stan semafora jest ustawiony na sygnał, gdy jego liczba jest większa niż zero, a niepodpisane, gdy jej liczba wynosi zero.
Obiekt semafora jest przydatny w kontrolowaniu udostępnionego zasobu, który może obsługiwać ograniczoną liczbę użytkowników. Działa jako brama, która ogranicza liczbę wątków współużytkujących zasób do określonej maksymalnej liczby. Na przykład aplikacja może ograniczyć liczbę tworzonych okien. Używa semafora z maksymalną liczbą równą limitowi okna, co pozwala ograniczyć liczbę za każdym razem, gdy zostanie utworzone okno i zwiększa je po zamknięciu okna. Aplikacja określa obiekt semafora w wywołaniu do jednej z funkcji oczekiwania przed utworzeniem każdego okna. Gdy liczba jest równa zero — wskazująca, że osiągnięto limit okna — funkcja wait blokuje wykonywanie kodu tworzenia okna.
Wątek używa funkcji CreateSemaphore lub CreateSemaphoreEx w celu utworzenia obiektu semafora. Wątek tworzenia określa początkową liczbę i maksymalną wartość liczby dla obiektu. Początkowa liczba nie może być mniejsza ani mniejsza niż zero, ani większa niż maksymalna wartość. Wątek tworzący może również określać nazwę obiektu semafora. Wątki w innych procesach mogą otwierać uchwyt do istniejącego obiektu semafora, określając jego nazwę w wywołaniu funkcji OpenSemaphore. Aby uzyskać dodatkowe informacje o nazwach obiektów mutex, event, semaphore i timer, zobacz Interprocess Synchronization.
Jeśli na semafor czeka więcej niż jeden wątek, zostanie wybrany wątek oczekiwania. Nie należy zakładać kolejności pierwszy na wyjścia (FIFO). Zdarzenia zewnętrzne, takie jak interfejsy API trybu jądra, mogą zmieniać kolejność oczekiwania.
Za każdym razem, gdy jedna z funkcji oczekiwania zwraca, ponieważ stan semafora został ustawiony na sygnalizowane, liczba semaforów jest zmniejszana o jeden. Funkcja ReleaseSemaphore zwiększa liczbę semaforów o określoną kwotę. Liczba nigdy nie może być mniejsza niż zero lub większa niż maksymalna wartość.
Początkowa liczba semaforów jest zwykle ustawiana na wartość maksymalną. Liczba jest następnie dekrementowana z tego poziomu, gdy jest używany chroniony zasób. Alternatywnie można utworzyć semafor z początkową liczbą zero, aby zablokować dostęp do chronionego zasobu podczas inicjowania aplikacji. Po zainicjowaniu można użyć ReleaseSemaphore, aby zwiększać liczbę do maksymalnej wartości.
Wątek, który jest właścicielem obiektu mutex, może wielokrotnie czekać, aż ten sam obiekt mutex zostanie zasygnalizowany bez jego wykonania staje się zablokowany. Wątek, który czeka wielokrotnie dla tego samego obiektu semafora, jednak dekrementuje liczbę semaforów za każdym razem, gdy operacja oczekiwania zostanie ukończona; wątek jest blokowany, gdy liczba osiągnie zero. Podobnie tylko wątek, który jest właścicielem mutexu, może pomyślnie wywołać funkcję ReleaseMutex, choć każdy wątek może używać ReleaseSemaphore, aby zwiększyć liczbę obiektu semafora.
Wątek może dekrementować liczbę semaforów więcej niż raz, wielokrotnie określając ten sam obiekt semafora w wywołaniach dowolnej z funkcji oczekiwania . Jednak wywołanie jednej z funkcji oczekiwania na wiele obiektów z tablicą zawierającą wiele dojść tego samego semafora nie powoduje wielu dekrementów.
Po zakończeniu korzystania z obiektu semaphore wywołaj funkcję CloseHandle, aby zamknąć uchwyt. Obiekt semafora jest niszczony po zamknięciu ostatniego uchwytu. Zamknięcie uchwytu nie ma wpływu na liczbę semaforów; dlatego przed zamknięciem uchwytu lub przed zakończeniem procesu należy wywołaćReleaseSemaphore. W przeciwnym razie oczekujące operacje oczekiwania upłynął limit czasu lub będą kontynuowane w nieskończoność, w zależności od tego, czy określono wartość limitu czasu.
Tematy pokrewne
-
używanie obiektów semafora