Condividi tramite


Mutex

Aggiornamento: novembre 2007

È possibile utilizzare un oggetto Mutex per fornire l'accesso esclusivo a una risorsa. La classe Mutex utilizza più risorse di sistema rispetto a Monitor, ma può essere sottoposta a marshalling oltre i limiti del dominio applicazione e può essere utilizzata per gestire più condizioni di attesa e per sincronizzare i thread in processi differenti. Per un confronto dei meccanismi di sincronizzazione gestiti, vedere Cenni preliminari sulle primitive di sincronizzazione.

Per esempi di codice, vedere la documentazione di riferimento per i costruttori Mutex.

Utilizzo dei mutex

Un thread chiama il metodo WaitOne di un mutex per richiedere la proprietà di quest'ultimo. La chiamata rimane bloccata finché il mutex non è disponibile o finché non è trascorso l'intervallo di timeout facoltativo. Se un mutex non è di proprietà di alcun thread, il relativo stato risulta segnalato.

Un thread rilascia un mutex chiamando il relativo metodo ReleaseMutex. I mutex presentano affinità di thread, ossia possono essere rilasciati solo dal thread che ne è proprietario. Se un thread rilascia un mutex di cui non è proprietario, nel thread viene generata un'eccezione ApplicationException.

Poiché la classe Mutex deriva da WaitHandle, è anche possibile chiamare il metodo statico WaitAll o WaitAny di WaitHandle per richiedere la proprietà di un Mutex in combinazione con altri handle di attesa.

Se un thread è proprietario di un Mutex, può specificare lo stesso Mutex in chiamate ripetute di attesa-richiesta senza bloccarne l'esecuzione. Per non esserne più proprietario deve tuttavia rilasciare il Mutex lo stesso numero di volte.

Mutex abbandonati

Se un thread viene terminato senza rilasciare un Mutex, si dice che il mutex viene abbandonato. In genere si tratta di un grave errore di programmazione poiché è possibile che la risorsa protetta dal mutex venga lasciata in uno stato incoerente. In .NET Framework versione 2.0 viene generata un'eccezione AbandonedMutexException nel successivo thread che acquisisce il mutex.

Nota:

In .NET Framework versioni 1.0 e 1.1, un Mutex abbandonato viene impostato sullo stato segnalato e la proprietà del mutex viene acquisita dal successivo thread in attesa. Se nessun thread è in attesa, il Mutex rimane nello stato segnalato. Non viene generata alcuna eccezione.

Nel caso di un mutex di sistema, un mutex abbandonato può indicare che un'applicazione è stata interrotta in modo anomalo, ad esempio tramite Gestione attività Windows.

Mutex locali e di sistema

Esistono due tipi di mutex: mutex locali e mutex di sistema denominati. Se si crea un oggetto Mutex utilizzando un costruttore che accetta un nome, questo viene associato a un oggetto del sistema operativo con il nome specificato. I mutex di sistema denominati sono visibili in tutto il sistema operativo e possono essere utilizzati per sincronizzare le attività dei processi. È possibile creare più oggetti Mutex che rappresentano lo stesso mutex di sistema denominato ed è possibile utilizzare il metodo OpenExisting per aprire un mutex di sistema denominato esistente.

Un mutex locale esiste solo all'interno del processo. Può essere utilizzato da qualsiasi thread del processo che presenti un riferimento all'oggetto Mutex locale. Ciascun oggetto Mutex è un mutex locale distinto.

Protezione del controllo di accesso per i mutex di sistema

.NET Framework versione 2.0 consente di interrogare e impostare la protezione del controllo di accesso Windows per gli oggetti di sistema denominati. Si consiglia di proteggere i mutex di sistema sin dal momento della creazione perché gli oggetti di sistema sono definiti a livello globale e possono quindi essere bloccati da altro codice.

Per informazioni sulla protezione del controllo di accesso per i mutex, vedere le classi MutexSecurity e MutexAccessRule, l'enumerazione MutexRights, i metodi GetAccessControl, SetAccessControl e OpenExisting della classe Mutex e il costruttore Mutex(Boolean, String, Boolean%, MutexSecurity).

Vedere anche

Concetti

Monitor

Thread e threading

Riferimenti

Mutex

Mutex

MutexSecurity

MutexAccessRule

Altre risorse

Threading gestito

Oggetti e funzionalità del threading