Condividi tramite


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 CMultiLockdistruttore 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.

Vedi anche

Grafico della gerarchia