Udostępnij za pośrednictwem


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

Członkowie

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

Cobject

CSyncObject

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

Zobacz też

Klasa CSyncObject
Wykres hierarchii