Classe CMultiLock
Rappresenta il meccanismo di controllo di accesso utilizzato per controllare l'accesso alle risorse di un programma multithread.
Sintassi
class CMultiLock
Membri
Costruttori pubblici
Nome | Descrizione |
---|---|
CMultiLock::CMultiLock | Costruisce un oggetto CMultiLock . |
Metodi pubblici
Nome | Descrizione |
---|---|
CMultiLock::IsLocked | Determina se un oggetto di sincronizzazione specifico nella matrice è bloccato. |
CMultiLock::Lock | Attende la matrice di oggetti di sincronizzazione. |
CMultiLock::Unlock | Rilascia tutti gli oggetti di sincronizzazione di proprietà. |
Osservazioni:
CMultiLock
non dispone di una classe di base.
Per usare le classi di sincronizzazione CSemaphore, CMutex e CEvent, è possibile creare un CMultiLock
oggetto o CSingleLock per attendere e rilasciare l'oggetto di sincronizzazione. Usare CMultiLock
quando sono presenti più oggetti che è possibile usare in un determinato momento. Usare CSingleLock
quando è necessario attendere un solo oggetto alla volta.
Per usare un CMultiLock
oggetto , creare prima di tutto una matrice degli oggetti di sincronizzazione da attendere. Chiamare quindi il CMultiLock
costruttore dell'oggetto all'interno di una funzione membro nella classe della risorsa controllata. Chiamare quindi la funzione membro Lock per determinare se una risorsa è disponibile (segnalata). In caso affermativo, continuare con il resto della funzione membro. Se non è disponibile alcuna risorsa, attendere un periodo di tempo specificato per il rilascio di una risorsa o restituire un errore. Al termine dell'utilizzo di una risorsa, chiamare la funzione Unlock se l'oggetto CMultiLock
deve essere usato di nuovo oppure consentire l'eliminazione definitiva dell'oggetto CMultiLock
.
CMultiLock
gli oggetti sono più utili quando un thread ha un numero elevato di CEvent
oggetti a cui può rispondere. Creare una matrice contenente tutti i CEvent
puntatori e chiamare Lock
. In questo modo il thread attenderà fino a quando non viene segnalato uno degli eventi.
Per altre informazioni su come usare CMultiLock
gli oggetti, vedere l'articolo Multithreading: Come usare le classi di sincronizzazione.
Gerarchia di ereditarietà
CMultiLock
Requisiti
Intestazione: afxmt.h
CMultiLock::CMultiLock
Costruisce un oggetto CMultiLock
.
CMultiLock(
CSyncObject* ppObjects [ ],
DWORD dwCount,
BOOL bInitialLock = FALSE);
Parametri
ppObjects
Matrice di puntatori agli oggetti di sincronizzazione da attendere. Non può essere NULL.
dwCount
Numero di oggetti in ppObjects. Deve essere maggiore di 0.
bInitialLock
Specifica se tentare inizialmente di accedere a uno degli oggetti forniti.
Osservazioni:
Questa funzione viene chiamata dopo la creazione della matrice di oggetti di sincronizzazione da attendere. Viene in genere chiamato dall'interno del thread che deve attendere che uno degli oggetti di sincronizzazione diventi disponibile.
CMultiLock::IsLocked
Determina se l'oggetto specificato non è firmato (non disponibile).
BOOL IsLocked(DWORD dwItem);
Parametri
dwItem
Indice nella matrice di oggetti corrispondenti all'oggetto su cui viene eseguita una query sullo stato.
Valore restituito
Diverso da zero se l'oggetto specificato è bloccato; in caso contrario, 0.
CMultiLock::Lock
Chiamare questa funzione per ottenere l'accesso a una o più risorse controllate dagli oggetti di sincronizzazione forniti al CMultiLock
costruttore.
DWORD Lock(
DWORD dwTimeOut = INFINITE,
BOOL bWaitForAll = TRUE,
DWORD dwWakeMask = 0);
Parametri
dwTimeOut
Specifica la quantità di tempo di attesa per la disponibilità dell'oggetto di sincronizzazione (segnalato). Se INFINITE, Lock
attenderà fino a quando l'oggetto non viene segnalato prima della restituzione.
bWaitForAll
Specifica se tutti gli oggetti in attesa devono essere segnalato contemporaneamente prima di restituire. Se FALSE, Lock
restituirà quando viene segnalato uno degli oggetti su cui è in attesa.
dwWakeMask
Specifica altre condizioni consentite per interrompere l'attesa. Per un elenco completo delle opzioni disponibili per questo parametro, vedere MsgWaitForMultipleObjects in Windows SDK.
Valore restituito
Se Lock
ha esito negativo, restituisce - 1. In caso di esito positivo, restituisce uno dei valori seguenti:
Tra WAIT_OBJECT_0 e WAIT_OBJECT_0 + (numero di oggetti - 1)
Se bWaitForAll è TRUE, tutti gli oggetti vengono segnalato (disponibili). Se bWaitForAll è FALSE, il valore restituito - WAIT_OBJECT_0 è l'indice nella matrice di oggetti dell'oggetto segnalato (disponibile).
WAIT_OBJECT_0 + (numero di oggetti)
Un evento specificato in dwWakeMask è disponibile nella coda di input del thread.
Tra WAIT_ABANDONED_0 e WAIT_ABANDONED_0 + (numero di oggetti - 1)
Se bWaitForAll è TRUE, tutti gli oggetti vengono segnalato e almeno uno degli oggetti è un oggetto mutex abbandonato. Se bWaitForAll è FALSE, il valore restituito - WAIT_ABANDONED_0 è l'indice nella matrice di oggetti dell'oggetto mutex abbandonato che ha soddisfatto l'attesa.
WAIT_TIMEOUT
L'intervallo di timeout specificato in dwTimeOut è scaduto senza l'esito positivo dell'attesa.
Osservazioni:
Se bWaitForAll è TRUE, Lock
verrà restituito correttamente non appena tutti gli oggetti di sincronizzazione vengono rilevati contemporaneamente. Se bWaitForAll è FALSE, Lock
restituirà non appena viene segnalato uno o più oggetti di sincronizzazione.
Se Lock
non è in grado di restituire immediatamente, attenderà non più del numero di millisecondi specificato nel parametro dwTimeOut prima di restituire . Se dwTimeOut è INFINITE, Lock
non verrà restituito fino a quando non viene ottenuto l'accesso a un oggetto o viene soddisfatta una condizione specificata in dwWakeMask . In caso contrario, se Lock
è stato possibile acquisire un oggetto di sincronizzazione, verrà restituito correttamente. In caso contrario, restituirà un errore.
CMultiLock::Unlock
Rilascia l'oggetto di sincronizzazione di proprietà di CMultiLock
.
BOOL Unlock();
BOOL Unlock(
LONG lCount,
LPLONG lPrevCount = NULL);
Parametri
lCount
Numero di conteggi dei riferimenti 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 per l'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 CMultiLock
distruttore di .
La prima forma di tenta di Unlock
sbloccare l'oggetto di sincronizzazione gestito da CMultiLock
. La seconda forma di tenta di Unlock
sbloccare gli CSemaphore
oggetti di proprietà di CMultiLock
. Se CMultiLock
non è proprietario di alcun oggetto bloccato CSemaphore
, la funzione restituisce FALSE; in caso contrario, restituisce TRUE. lCount e lpPrevCount corrispondono esattamente ai parametri di CSingleLock::Unlock. La seconda forma di Unlock
è raramente applicabile alle situazioni multilock.