Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Un oggetto della classe CSemaphore rappresenta un "semaforo". Un semaforo è un oggetto di sincronizzazione che controlla l'accesso alle risorse condivise e impedisce le race condition.
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 altri utenti consentiti. Quando il conteggio raggiunge lo zero, tutti i tentativi di utilizzare la risorsa controllata dall'oggetto CSemaphore vengono 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 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 è 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
CSemaforo::CSemaforo
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 si accede al semaforo 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 non riesce.
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 CMultiLock oggetto o CSingleLock e chiamarne Lock le funzioni membro 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.