Udostępnij za pośrednictwem


CSingleLock Klasa

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

Składnia

class CSingleLock

Elementy członkowskie

Konstruktory publiczne

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

Metody publiczne

Nazwa/nazwisko opis
CSingleLock::IsLocked Określa, czy obiekt jest zablokowany.
CSingleLock::Lock Czeka na obiekt synchronizacji.
CSingleLock::Unlock Zwalnia obiekt synchronizacji.

Uwagi

CSingleLock nie ma klasy bazowej.

Aby można było używać klas CSemaphoresynchronizacji , , CMutexCCriticalSectioni CEvent, należy utworzyć CSingleLock obiekt lub CMultiLock czekać i zwolnić obiekt synchronizacji. Użyj CSingleLock polecenia , gdy trzeba poczekać tylko na jeden obiekt naraz. Użyj CMultiLock polecenia , gdy istnieje wiele obiektów, których można użyć w określonym czasie.

Aby użyć CSingleLock obiektu, wywołaj jego konstruktor wewnątrz funkcji składowej w kontrolnej klasie zasobu. Następnie wywołaj funkcję składową IsLocked , aby określić, czy zasób jest dostępny. Jeśli tak jest, kontynuuj z pozostałą częścią funkcji składowej. Jeśli zasób jest niedostępny, zaczekaj na określoną ilość czasu, aż zasób ma zostać zwolniony lub wystąpi błąd powrotu. Po zakończeniu korzystania z zasobu wywołaj Unlock funkcję , jeśli CSingleLock obiekt ma zostać użyty ponownie, lub zezwól CSingleLock na zniszczenie obiektu.

CSingleLock obiekty wymagają obecności obiektu pochodzącego z CSyncObjectobiektu . Zazwyczaj jest to element członkowski danych klasy kontrolowanego zasobu. Aby uzyskać więcej informacji na temat używania obiektów, zobacz artykuł Multithreading: How to Use the Synchronization Classes (Jak używać CSingleLock klas synchronizacji).

Hierarchia dziedziczenia

CSingleLock

Wymagania

Nagłówek: afxmt.h

CSingleLock::CSingleLock

CSingleLock Tworzy obiekt.

explicit CSingleLock(
    CSyncObject* pObject,
    BOOL bInitialLock = FALSE);

Parametry

pObject
Wskazuje na dostęp do obiektu synchronizacji. Nie można mieć .NULL

bInitialLock
Określa, czy należy początkowo podjąć próbę uzyskania dostępu do dostarczonego obiektu.

Uwagi

Ta funkcja jest zwykle wywoływana z poziomu funkcji składowej dostępu kontrolowanego zasobu.

Przykład

// m_CritSection is a data member (of type CCriticalSection)
// of an existing class that implements the resource being shared.

// Relate the synchronization object (m_CritSection) with
// our CSingleLock object. 
CSingleLock singleLock(&m_CritSection);
singleLock.Lock();  // Attempt to lock the shared resource
if (singleLock.IsLocked())  // Resource has been locked
{
   //...use the shared resource...

   // Now that we are finished, 
   // unlock the resource for others.
   singleLock.Unlock();
}

CSingleLock::IsLocked

Określa, czy obiekt skojarzony z obiektem CSingleLock jest niepodpisany (niedostępny).

BOOL IsLocked();

Wartość zwracana

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

Przykład

// m_Mutex is a data member (of type CMutex)
// of an existing class that implements the resource being shared.

// Relate the synchronization object (m_Mutex) with
// our CSingleLock object. 
CSingleLock singleLock(&m_Mutex);

// Attempt to lock the shared resource
singleLock.Lock(100);    // Wait 100 ms...

// Has the resource been successfully locked?
if (singleLock.IsLocked())
{
   // We were able to lock the resource;
   // we may now work with the data associated with the mutex...

   // Now that we are finished, unlock the resource for others.
   singleLock.Unlock();
}

CSingleLock::Lock

Wywołaj tę funkcję, aby uzyskać dostęp do zasobu kontrolowanego przez obiekt synchronizacji dostarczony do konstruktora CSingleLock .

BOOL Lock(DWORD dwTimeOut = INFINITE);

Parametry

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

Wartość zwracana

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

Uwagi

Jeśli obiekt synchronizacji zostanie zasygnalizowany, zostanie zwrócony pomyślnie, Lock a wątek jest teraz właścicielem obiektu. Jeśli obiekt synchronizacji jest niepodpisany (niedostępny), Lock zaczeka na zasygnalizowanie obiektu synchronizacji do liczby milisekund określonych w parametrze dwTimeOut . Jeśli obiekt synchronizacji nie został zasygnalizowany w określonym czasie, Lock zwraca błąd.

Przykład

// m_Mutex is a data member (of type CMutex)
// of an existing class that implements the resource being shared.

// Relate the synchronization object (m_Mutex) with
// our CSingleLock object. 
CSingleLock singleLock(&m_Mutex);

// Attempt to lock the shared resource
if (singleLock.Lock(100))    // Wait 100 ms...
{
   // We were able to lock the resource;
   // we may now work with the data associated with the mutex...

   // Now that we are finished, unlock the resource for others.
   singleLock.Unlock();
}

CSingleLock::Unlock

Zwalnia obiekt synchronizacji należący do CSingleLockelementu .

BOOL Unlock();

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

Parametry

lCount
Liczba dostępu 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 FALSEwartość .

lPrevCount
Wskazuje zmienną, aby otrzymać poprzednią liczbę obiektu synchronizacji. Jeśli NULLwartość , 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 CSingleLockdestruktor .

Jeśli musisz zwolnić więcej niż jedną liczbę dostępu semafora, użyj drugiej formy Unlock i określ liczbę dostępu do wydania.

Przykład

// m_Mutex is a data member (of type CMutex)
// of an existing class that implements the resource being shared.

// Relate the synchronization object (m_Mutex) with
// our CSingleLock object. 
CSingleLock singleLock(&m_Mutex);

// Attempt to lock the shared resource
if (singleLock.Lock(100))    // Wait 100 ms...
{
   // We were able to lock the resource;
   // we may now work with the data associated with the mutex...

   // Now that we are finished, unlock the resource for others.
   singleLock.Unlock();
}

Zobacz też

Wykres hierarchii
CMultiLock Klasa