Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Obiekt klasy CSemaphore
reprezentuje "semafor". Semafor to obiekt synchronizacji, który kontroluje dostęp do udostępnionych zasobów i zapobiega warunkom wyścigu.
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
obiektu to liczba dozwolonych innych 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 liczba wzrośnie 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 metodę 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 jest 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 jest uzyskiwany 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
CSemafor::CSemafor
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 jest uzyskiwany przez granice procesu. 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 CMultiLock
obiekt lub CSingleLock
i wywołaj jego Lock
funkcje członkowskie i 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.