Klasa CSemaphore
Obiekt klasy CSemaphore
reprezentuje "semafor" — obiekt synchronizacji, który umożliwia ograniczoną liczbę wątków w co najmniej jednym procesie w celu uzyskania dostępu do liczby wątków, które obecnie uzyskują dostęp do określonego zasobu.
Składnia
class CSemaphore : public CSyncObject
Elementy członkowskie
Konstruktory publiczne
Nazwa/nazwisko | opis |
---|---|
CSemaphore::CSemaphore | CSemaphore Tworzy obiekt. |
Uwagi
Semaphores są przydatne w kontrolowaniu dostępu do udostępnionego zasobu, który może obsługiwać tylko ograniczoną liczbę użytkowników. Bieżąca liczba CSemaphore
obiektów to liczba dozwolonych dodatkowych użytkowników. Gdy liczba osiągnie zero, wszystkie próby użycia zasobu kontrolowanego przez CSemaphore
obiekt zostaną wstawione do kolejki systemowej i zaczekają na przekroczenie limitu czasu lub wzrost liczby powyżej 0. Maksymalna liczba użytkowników, którzy mogą jednocześnie uzyskać dostęp do kontrolowanego CSemaphore
zasobu, jest określana podczas budowy obiektu.
Aby użyć CSemaphore
obiektu, skonstruuj CSemaphore
obiekt w razie potrzeby. Określ nazwę semafora, który chcesz zaczekać, i że aplikacja powinna początkowo być właścicielem. Następnie można uzyskać dostęp do semafora po powrocie konstruktora. Wywołaj obiekt CSyncObject::Unlock po zakończeniu uzyskiwania dostępu do kontrolowanego zasobu.
Alternatywną metodą używania CSemaphore
obiektów jest dodanie zmiennej typu CSemaphore
jako składowej danych do klasy, którą chcesz kontrolować. Podczas budowy kontrolowanego obiektu wywołaj konstruktor CSemaphore
elementu członkowskiego danych określający początkową liczbę dostępu, maksymalną liczbę dostępu, nazwę semafora (jeśli będzie używany przez granice procesu) i żądane atrybuty zabezpieczeń.
Aby uzyskać dostęp do zasobów kontrolowanych przez CSemaphore
obiekty w ten sposób, najpierw utwórz zmienną typu CSingleLock lub wpisz CMultiLock w funkcji składowej dostępu zasobu. Następnie wywołaj funkcję składową obiektu Lock
lock (na przykład CSingleLock::Lock). W tym momencie wątek uzyska dostęp do zasobu, poczekaj, aż zasób zostanie zwolniony i uzyska dostęp, albo zaczekaj, aż zasób zostanie zwolniony i upłynął limit czasu, nie uzyskasz dostępu do zasobu. W każdym razie zasób został dostępny w bezpieczny wątkowo sposób. Aby zwolnić zasób, użyj funkcji składowej obiektu Unlock
blokady (na przykład CSingleLock::Unlock) lub zezwól obiektowi blokady na wyjście z zakresu.
Alternatywnie można utworzyć CSemaphore
obiekt autonomiczny i uzyskać do niego dostęp jawnie przed podjęciem próby uzyskania dostępu do kontrolowanego zasobu. Ta metoda, choć jaśniejsza dla kogoś czytającego kod źródłowy, jest bardziej podatna na błędy.
Aby uzyskać więcej informacji na temat używania obiektów, zobacz artykuł Multithreading: How to Use the Synchronization Classes (Jak używać CSemaphore
klas synchronizacji).
Hierarchia dziedziczenia
CSemaphore
Wymagania
Nagłówek: afxmt.h
CSemaphore::CSemaphore
Tworzy nazwany lub nienazwany CSemaphore
obiekt.
CSemaphore(
LONG lInitialCount = 1,
LONG lMaxCount = 1,
LPCTSTR pstrName = NULL,
LPSECURITY_ATTRIBUTES lpsaAttributes = NULL);
Parametry
lInitialCount
Początkowa liczba użycia semafora. Musi być większa lub równa 0 i mniejsza niż lub równa lMaxCount.
lMaxCount
Maksymalna liczba użycia semafora. Wartość musi być większa niż 0.
pstrName
Nazwa semafora. Należy podać, jeśli semafor będzie uzyskiwany dostęp przez granice procesów. Jeśli NULL
obiekt będzie nienazwany. Jeśli nazwa pasuje do istniejącego semafora, konstruktor tworzy nowy CSemaphore
obiekt, który odwołuje się do semafora tej nazwy. Jeśli nazwa pasuje do istniejącego obiektu synchronizacji, który nie jest semaforem, konstrukcja zakończy się niepowodzeniem.
lpsaAttributes
Atrybuty zabezpieczeń obiektu semafora. Aby uzyskać pełny opis tej struktury, zobacz SECURITY_ATTRIBUTES w zestawie Windows SDK.
Uwagi
Aby uzyskać dostęp do obiektu lub zwolnić CSemaphore
go, utwórz obiekt CMultiLock lub CSingleLock i wywołaj jego funkcje składowe Lock and Unlock .
Ważne
Po utworzeniu CSemaphore
obiektu użyj polecenia GetLastError , aby upewnić się, że mutex jeszcze nie istnieje. Jeśli mutex nie istnieje nieoczekiwanie, może wskazywać, że nieuczciwy proces kuca i może być zamierza użyć mutex złośliwie. W takim przypadku zalecaną procedurą świadomą zabezpieczeń jest zamknięcie uchwytu i kontynuowanie tak, jakby wystąpił błąd podczas tworzenia obiektu.