Classe CSemaphore
Un oggetto della classe CSemaphore
rappresenta un "semaforo", ovvero un oggetto di sincronizzazione che consente a un numero limitato di thread in uno o più processi di accedere a un oggetto Mantiene un conteggio del numero di thread che attualmente accedono a una risorsa specificata.
Sintassi
class CSemaphore : public CSyncObject
Membri
Costruttori pubblici
Nome | Descrizione |
---|---|
CSemaphore::CSemaphore | Costruisce un oggetto CSemaphore . |
Osservazioni:
I semafori sono utili per controllare l'accesso a una risorsa condivisa che può supportare solo un numero limitato di utenti. Il conteggio corrente dell'oggetto CSemaphore
è il numero di utenti aggiuntivi consentiti. Quando il conteggio raggiunge lo zero, tutti i tentativi di usare la risorsa controllata dall'oggetto CSemaphore
verranno inseriti in una coda di sistema e attendere il timeout o il conteggio aumenta oltre 0. Il numero massimo di utenti che possono accedere alla risorsa controllata contemporaneamente viene specificato durante la costruzione dell'oggetto CSemaphore
.
Per utilizzare un CSemaphore
oggetto , costruire l'oggetto CSemaphore
quando necessario. Specificare il nome del semaforo che si desidera attendere e che l'applicazione deve essere proprietaria inizialmente. È quindi possibile accedere al semaforo quando viene restituito il costruttore. Chiamare CSyncObject::Unlock al termine dell'accesso alla risorsa controllata.
Un metodo alternativo per l'uso CSemaphore
degli oggetti consiste nell'aggiungere una variabile di tipo CSemaphore
come membro dati alla classe che si desidera controllare. Durante la costruzione dell'oggetto controllato, chiamare il costruttore del membro dati specificando il conteggio di accesso iniziale, il numero massimo di accessi, il nome del semaforo (se verrà usato attraverso i limiti del CSemaphore
processo) e gli attributi di sicurezza desiderati.
Per accedere alle risorse controllate dagli CSemaphore
oggetti in questo modo, creare prima di tutto una variabile di tipo CSingleLock o di tipo CMultiLock nella funzione membro di accesso della risorsa. Chiamare quindi la funzione membro dell'oggetto Lock
lock, ad esempio CSingleLock::Lock. A questo punto, il thread otterrà l'accesso alla risorsa, attenderà il rilascio della risorsa e otterrà l'accesso o attenderà il rilascio e il timeout della risorsa, senza ottenere l'accesso alla risorsa. In ogni caso, la risorsa è stata accessibile in modo thread-safe. Per rilasciare la risorsa, usare la funzione membro dell'oggetto Unlock
lock (ad esempio, CSingleLock::Unlock) o consentire all'oggetto lock di uscire dall'ambito.
In alternativa, è possibile creare un CSemaphore
oggetto autonomo e accedervi in modo esplicito prima di tentare di accedere alla risorsa controllata. Questo metodo, mentre più chiaro a un utente che legge il codice sorgente, è più soggetto a errori.
Per altre informazioni su come usare CSemaphore
gli oggetti, vedere l'articolo Multithreading: Come usare le classi di sincronizzazione.
Gerarchia di ereditarietà
CSemaphore
Requisiti
Intestazione: afxmt.h
CSemaphore::CSemaphore
Costruisce un oggetto denominato o senza CSemaphore
nome.
CSemaphore(
LONG lInitialCount = 1,
LONG lMaxCount = 1,
LPCTSTR pstrName = NULL,
LPSECURITY_ATTRIBUTES lpsaAttributes = NULL);
Parametri
lInitialCount
Conteggio di utilizzo iniziale per il semaforo. Deve essere maggiore o uguale a 0 e minore o uguale a lMaxCount.
lMaxCount
Numero massimo di utilizzo per il semaforo. Deve essere maggiore di 0.
pstrName
Nome del semaforo. Deve essere fornito se il semaforo sarà accessibile attraverso i limiti del processo. Se NULL
, l'oggetto verrà senza nome. Se il nome corrisponde a un semaforo esistente, il costruttore compila un nuovo CSemaphore
oggetto che fa riferimento al semaforo di tale nome. Se il nome corrisponde a un oggetto di sincronizzazione esistente che non è un semaforo, la costruzione avrà esito negativo.
lpsaAttributes
Attributi di sicurezza per l'oggetto semaforo. Per una descrizione completa di questa struttura, vedere SECURITY_ATTRIBUTES in Windows SDK.
Osservazioni:
Per accedere o rilasciare un CSemaphore
oggetto, creare un oggetto CMultiLock o CSingleLock e chiamarne le funzioni membro Lock e Unlock .
Importante
Dopo aver creato l'oggetto CSemaphore
, usare GetLastError per assicurarsi che il mutex non esista già. Se il mutex esiste in modo imprevisto, potrebbe indicare che un processo non autorizzato è squatting e potrebbe voler usare il mutex in modo dannoso. In questo caso, la procedura consigliata per la sicurezza consiste nel chiudere l'handle e continuare come se si verificasse un errore nella creazione dell'oggetto.