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 CSemaphore
synchronizacji , , CMutex
CCriticalSection
i 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 CSyncObject
obiektu . 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 INFINITE
parametr 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 CSingleLock
elementu .
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 FALSE
wartość .
lPrevCount
Wskazuje zmienną, aby otrzymać poprzednią liczbę obiektu synchronizacji. Jeśli NULL
wartość , 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 CSingleLock
destruktor .
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();
}