Udostępnij za pośrednictwem


Klasa CMultiLock

Reprezentuje mechanizm kontroli dostępu używany w kontrolowaniu dostępu do zasobów w programie wielowątkowym.

Składnia

class CMultiLock

Elementy członkowskie

Konstruktory publiczne

Nazwa/nazwisko opis
CMultiLock::CMultiLock CMultiLock Tworzy obiekt.

Metody publiczne

Nazwa/nazwisko opis
CMultiLock::IsLocked Określa, czy określony obiekt synchronizacji w tablicy jest zablokowany.
CMultiLock::Lock Czeka na tablicę obiektów synchronizacji.
CMultiLock::Unlock Zwalnia wszystkie należące do niego obiekty synchronizacji.

Uwagi

CMultiLock nie ma klasy bazowej.

Aby użyć klas synchronizacji CSemaphore, CMutex i CEvent, można utworzyć CMultiLock obiekt lub CSingleLock do oczekiwania i zwolnić obiekt synchronizacji. Użyj CMultiLock polecenia , gdy istnieje wiele obiektów, których można użyć w określonym czasie. Użyj CSingleLock polecenia , gdy trzeba poczekać tylko na jeden obiekt naraz.

Aby użyć CMultiLock obiektu, najpierw utwórz tablicę obiektów synchronizacji, na które chcesz poczekać. Następnie wywołaj CMultiLock konstruktor obiektu wewnątrz funkcji składowej w kontrolnej klasie zasobu. Następnie wywołaj funkcję elementu członkowskiego Blokada, aby określić, czy zasób jest dostępny (zasygnalizowany). Jeśli tak jest, kontynuuj z pozostałą częścią funkcji składowej. Jeśli zasób nie jest dostępny, zaczekaj na określoną ilość czasu na zwolnienie zasobu lub niepowodzenie powrotu. Po zakończeniu korzystania z zasobu wywołaj funkcję Unlock , jeśli CMultiLock obiekt ma zostać użyty ponownie, lub zezwól CMultiLock na zniszczenie obiektu.

CMultiLock obiekty są najbardziej przydatne, gdy wątek ma dużą liczbę CEvent obiektów, na które może reagować. Utwórz tablicę zawierającą CEvent wszystkie wskaźniki i wywołaj metodę Lock. Spowoduje to, że wątek będzie czekać, aż zostanie zasygnalizowany jeden z zdarzeń.

Aby uzyskać więcej informacji na temat używania obiektów, zobacz artykuł Multithreading: How to Use the Synchronization Classes (Jak używać CMultiLock klas synchronizacji).

Hierarchia dziedziczenia

CMultiLock

Wymagania

Nagłówek: afxmt.h

CMultiLock::CMultiLock

CMultiLock Tworzy obiekt.

CMultiLock(
    CSyncObject* ppObjects [ ],
    DWORD dwCount,
    BOOL bInitialLock = FALSE);

Parametry

ppObjects
Tablica wskaźników do obiektów synchronizacji, które mają być czekane. Nie można mieć wartości NULL.

dwCount
Liczba obiektów w obiekcie ppObjects. Wartość musi być większa niż 0.

bInitialLock
Określa, czy należy początkowo podjąć próbę uzyskania dostępu do dowolnego z podanych obiektów.

Uwagi

Ta funkcja jest wywoływana po utworzeniu tablicy obiektów synchronizacji do oczekiwania. Zwykle jest wywoływana z poziomu wątku, który musi czekać, aż jeden z obiektów synchronizacji stanie się dostępny.

CMultiLock::IsLocked

Określa, czy określony obiekt jest niepodpisany (niedostępny).

BOOL IsLocked(DWORD dwItem);

Parametry

dwItem
Indeks w tablicy obiektów odpowiadających obiektowi, którego stan jest badany.

Wartość zwracana

Nonzero, jeśli określony obiekt jest zablokowany; w przeciwnym razie 0.

CMultiLock::Lock

Wywołaj tę funkcję, aby uzyskać dostęp do co najmniej jednego zasobu kontrolowanego przez obiekty synchronizacji dostarczone do konstruktora CMultiLock .

DWORD Lock(
    DWORD dwTimeOut = INFINITE,
    BOOL bWaitForAll = TRUE,
    DWORD dwWakeMask = 0);

Parametry

dwTimeOut
Określa czas oczekiwania na dostępność obiektu synchronizacji (sygnał). Jeśli parametr NIESKOŃCZONY, Lock będzie czekać, aż obiekt zostanie zasygnalizowany przed zwróceniem.

bWaitForAll
Określa, czy wszystkie obiekty oczekujące muszą być sygnalizowane w tym samym czasie przed zwróceniem. Jeśli wartość FALSE, zostanie zwrócona, Lock gdy zostanie zasygnalizowany jeden z obiektów, na które czeka.

dwWakeMask
Określa inne warunki, które mogą przerwać oczekiwanie. Aby uzyskać pełną listę dostępnych opcji dla tego parametru, zobacz MsgWaitForMultipleObjects w zestawie Windows SDK.

Wartość zwracana

Jeśli Lock zakończy się niepowodzeniem, zwraca wartość — 1. Jeśli operacja powiedzie się, zwraca jedną z następujących wartości:

  • Między WAIT_OBJECT_0 a WAIT_OBJECT_0 + (liczba obiektów — 1)

    Jeśli parametr bWaitForAll ma wartość TRUE, wszystkie obiekty są sygnalizowane (dostępne). Jeśli wartość bWaitForAll ma wartość FALSE, zwracana wartość — WAIT_OBJECT_0 jest indeksem w tablicy obiektów obiektu, który jest zasygnalizowany (dostępny).

  • WAIT_OBJECT_0 + (liczba obiektów)

    Zdarzenie określone w pliku dwWakeMask jest dostępne w kolejce wejściowej wątku.

  • Między WAIT_ABANDONED_0 a WAIT_ABANDONED_0 + (liczba obiektów — 1)

    Jeśli parametr bWaitForAll ma wartość TRUE, wszystkie obiekty są sygnalizowane, a co najmniej jeden z obiektów jest opuszczonym obiektem mutex. Jeśli wartość bWaitForAll ma wartość FALSE, zwracana wartość — WAIT_ABANDONED_0 jest indeksem w tablicy obiektów opuszczonego obiektu mutex, który spełnia oczekiwania.

  • WAIT_TIMEOUT

    Interwał limitu czasu określony w parametrze dwTimeOut wygasł bez pomyślnego oczekiwania.

Uwagi

Jeśli parametr bWaitForAll ma wartość TRUE, Lock zostanie zwrócony pomyślnie, gdy tylko wszystkie obiekty synchronizacji staną się sygnalizowane jednocześnie. Jeśli parametr bWaitForAll ma wartość FALSE, Lock zostanie zwrócony, gdy tylko co najmniej jeden obiekt synchronizacji zostanie zasygnalizowany.

Jeśli Lock nie można zwrócić natychmiast, przed zwróceniem będzie czekać nie więcej niż liczba milisekund określonych w parametrze dwTimeOut . Jeśli parametr dwTimeOut ma wartość INFINITE, Lock nie zostanie zwrócony, dopóki nie zostanie uzyskany dostęp do obiektu lub warunek określony w pliku dwWakeMask został spełniony. W przeciwnym razie, jeśli Lock udało się uzyskać obiekt synchronizacji, zostanie zwrócony pomyślnie. Jeśli nie, zwróci błąd.

CMultiLock::Unlock

Zwalnia obiekt synchronizacji należący do CMultiLockelementu .

BOOL Unlock();

BOOL Unlock(
    LONG lCount,
    LPLONG lPrevCount = NULL);

Parametry

lCount
Liczba odwołań do wydania. Wartość musi być większa niż 0. Jeśli określona kwota spowoduje przekroczenie maksymalnej liczby obiektu, liczba nie zostanie zmieniona, a funkcja zwróci wartość FALSE.

lPrevCount
Wskazuje zmienną, aby otrzymać poprzednią liczbę obiektów synchronizacji. Jeśli wartość NULL, poprzednia liczba nie zostanie zwrócona.

Wartość zwracana

Nonzero, jeśli funkcja zakończyła się pomyślnie; w przeciwnym razie 0.

Uwagi

Ta funkcja jest wywoływana przez CMultiLockdestruktor .

Pierwsza forma próby odblokowania Unlock obiektu synchronizacji zarządzanego przez CMultiLockprogram . Druga forma próby odblokowania Unlock CSemaphore obiektów należących do CMultiLockobiektu . Jeśli CMultiLock nie jest właścicielem żadnego zablokowanego CSemaphore obiektu, funkcja zwraca wartość FALSE. W przeciwnym razie zwraca wartość TRUE. lCount i lpPrevCount są dokładnie takie same jak parametry CSingleLock::Unlock. Druga forma Unlock rzadko ma zastosowanie do sytuacji z wieloma blokadami.

Zobacz też

Wykres hierarchii