Mutex

È possibile usare un oggetto Mutex per fornire l'accesso esclusivo a una risorsa. La classe Mutex usa più risorse di sistema della classe Monitor, ma è possibile eseguirne il marshalling fra i limiti del dominio dell'applicazione, può essere usata con più condizioni di attesa e può essere usata per sincronizzare i thread in processi diversi. Per un confronto dei meccanismi di sincronizzazione gestiti, vedere Panoramica sulle primitive di sincronizzazione.

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

Usare mutex

Un thread chiama il metodo WaitOne di un mutex per richiedere la proprietà. La chiamata viene bloccata finché il mutex non è disponibile o fino a quando l'intervallo di timeout facoltativo scade. Lo stato di un mutex viene segnalato se nessun thread lo possiede.

Un thread rilascia un mutex chiamando il relativo metodo ReleaseMutex. I mutex presentano affinità di thread; vale a dire il mutex può essere rilasciato solo dal thread che ne è proprietario. Se un thread rilascia un mutex di cui non è proprietario, nel thread viene generata una ApplicationException.

Poiché la classe Mutex deriva da WaitHandle, è anche possibile chiamare i metodi statici 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, quel thread può specificare lo stesso Mutex nelle chiamate di richiesta di attesa ripetute senza interromperne l'esecuzione. Tuttavia, deve rilasciare ogni volta il Mutex per rilasciare la proprietà.

Mutex abbandonati

Se un thread termina senza rilasciare un Mutex, quest'ultimo si definisce abbandonato. Ciò indica spesso un grave errore di programmazione perché la risorsa protetta dal mutex può essere lasciata in uno stato incoerente. Viene generata una AbandonedMutexException nel thread successivo che acquisisce il mutex.

Nel caso di un mutex di sistema, un mutex abbandonato potrebbe indicare che un'applicazione è stata terminata in modo anomalo (ad esempio, usando Gestione attività Windows).

Mutex locali e di sistema

Sono disponibili due tipi di mutex: i mutex locali e quelli denominati mutex di sistema. Se si crea un oggetto Mutex usando un costruttore che accetta un nome, è associato a un oggetto del sistema operativo di tale nome. I mutex denominati di sistema sono visibili in tutto il sistema operativo e possono essere usati per sincronizzare le attività dei processi. È possibile creare più oggetti Mutex che rappresentano lo stesso mutex di sistema denominato ed è possibile usare il metodo OpenExisting per aprire un mutex di sistema denominato esistente.

Un mutex locale esiste solo all'interno del processo. Può essere usato da qualsiasi thread nel processo che abbia un riferimento all'oggetto Mutex locale. Ogni oggetto Mutex è un mutex locale distinto.

Sicurezza del controllo di accesso per i Mutex di sistema

.NET Framework offre la possibilità di eseguire query e impostare la sicurezza del controllo di accesso di Windows per gli oggetti denominati di sistema. Si consiglia la protezione dei mutex di sistema dal momento della creazione perché gli oggetti di sistema sono globali e pertanto possono essere bloccati da un codice diverso dal proprio.

Per informazioni sulla sicurezza 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).

Nota

La sicurezza del controllo di accesso per i mutex di sistema è disponibile solo con .NET Framework, non è disponibile con .NET Core o .NET 5+.

Vedi anche