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à

CObject

CSyncObject

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.

Vedi anche

Classe CSyncObject
Grafico della gerarchia