Classe CSingleLock
Rappresenta il meccanismo di controllo di accesso utilizzato per controllare l'accesso a una risorsa di un programma multithread.
Sintassi
class CSingleLock
Membri
Costruttori pubblici
Nome | Descrizione |
---|---|
CSingleLock::CSingleLock |
Costruisce un oggetto CSingleLock . |
Metodi pubblici
Nome | Descrizione |
---|---|
CSingleLock::IsLocked |
Determina se l'oggetto è bloccato. |
CSingleLock::Lock |
Attende un oggetto di sincronizzazione. |
CSingleLock::Unlock |
Rilascia un oggetto di sincronizzazione. |
Osservazioni:
CSingleLock
non ha una classe base.
Per usare le classi CSemaphore
di sincronizzazione , CMutex
, CCriticalSection
e CEvent
, è necessario creare un CSingleLock
oggetto o CMultiLock
per attendere e rilasciare l'oggetto di sincronizzazione. Usare CSingleLock
quando è necessario attendere un solo oggetto alla volta. Usare CMultiLock
quando sono presenti più oggetti che è possibile usare in un determinato momento.
Per usare un CSingleLock
oggetto , chiamare il relativo costruttore all'interno di una funzione membro nella classe della risorsa controllata. Chiamare quindi la IsLocked
funzione membro per determinare se la risorsa è disponibile. In caso affermativo, continuare con il resto della funzione membro. Se la risorsa non è disponibile, attendere un periodo di tempo specificato per il rilascio della risorsa o restituire un errore. Al termine dell'utilizzo della risorsa, chiamare la Unlock
funzione se l'oggetto CSingleLock
deve essere usato di nuovo oppure consentire l'eliminazione definitiva dell'oggetto CSingleLock
.
CSingleLock
gli oggetti richiedono la presenza di un oggetto derivato da CSyncObject
. Si tratta in genere di un membro dati della classe della risorsa controllata. Per altre informazioni su come usare CSingleLock
gli oggetti, vedere l'articolo Multithreading: Come usare le classi di sincronizzazione.
Gerarchia di ereditarietà
CSingleLock
Requisiti
Intestazione: afxmt.h
CSingleLock::CSingleLock
Costruisce un oggetto CSingleLock
.
explicit CSingleLock(
CSyncObject* pObject,
BOOL bInitialLock = FALSE);
Parametri
pObject
Punta all'oggetto di sincronizzazione a cui accedere. Non può essere NULL
.
bInitialLock
Specifica se tentare inizialmente di accedere all'oggetto fornito.
Osservazioni:
Questa funzione viene in genere chiamata dall'interno di una funzione membro di accesso della risorsa controllata.
Esempio
// 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
Determina se l'oggetto associato all'oggetto CSingleLock
non è firmato (non disponibile).
BOOL IsLocked();
Valore restituito
Diverso da zero se l'oggetto è bloccato; in caso contrario, 0.
Esempio
// 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
Chiamare questa funzione per ottenere l'accesso alla risorsa controllata dall'oggetto di sincronizzazione fornito al CSingleLock
costruttore.
BOOL Lock(DWORD dwTimeOut = INFINITE);
Parametri
dwTimeOut
Specifica la quantità di tempo di attesa per la disponibilità dell'oggetto di sincronizzazione (segnalato). Se INFINITE
, Lock
attenderà finché l'oggetto non viene segnalato prima della restituzione.
Valore restituito
Diverso da zero se la funzione ha avuto esito positivo; in caso contrario, 0.
Osservazioni:
Se l'oggetto di sincronizzazione viene segnalato, Lock
verrà restituito correttamente e il thread ora è proprietario dell'oggetto . Se l'oggetto di sincronizzazione non è firmato (non disponibile), Lock
attenderà che l'oggetto di sincronizzazione venga segnalato fino al numero di millisecondi specificato nel dwTimeOut
parametro . Se l'oggetto di sincronizzazione non è stato segnalato nell'intervallo di tempo specificato, Lock
restituisce un errore.
Esempio
// 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
Rilascia l'oggetto di sincronizzazione di proprietà di CSingleLock
.
BOOL Unlock();
BOOL Unlock(
LONG lCount,
LPLONG lPrevCount = NULL);
Parametri
lCount
Numero di accessi da rilasciare. Deve essere maggiore di 0. Se la quantità specificata determina il superamento del numero massimo dell'oggetto, il conteggio non viene modificato e la funzione restituisce FALSE
.
lPrevCount
Punta a una variabile per ricevere il conteggio precedente dell'oggetto di sincronizzazione. Se NULL
, il conteggio precedente non viene restituito.
Valore restituito
Diverso da zero se la funzione ha avuto esito positivo; in caso contrario, 0.
Osservazioni:
Questa funzione viene chiamata dal CSingleLock
distruttore di .
Se è necessario rilasciare più di un numero di accessi di un semaforo, usare la seconda forma di Unlock
e specificare il numero di accessi da rilasciare.
Esempio
// 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();
}