Condividi tramite


Mutex

È possibile usare un Mutex oggetto per fornire l'accesso esclusivo a una risorsa. La Mutex classe usa più risorse di sistema rispetto alla Monitor classe, ma può essere eseguito il marshaling attraverso i limiti del dominio dell'applicazione, può essere utilizzato con più attese e può essere utilizzato per sincronizzare i thread in processi diversi. Per un confronto dei meccanismi di sincronizzazione gestiti, vedere Panoramica delle primitive di sincronizzazione.

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

Utilizzare mutex

Un thread chiama il WaitOne metodo di un mutex per richiedere la proprietà. La chiamata si blocca fino a quando il mutex diventa disponibile, o finché non termina l'intervallo di timeout facoltativo. Il mutex è considerato libero se non è posseduto da alcun thread.

Un thread rilascia un mutex chiamando il relativo ReleaseMutex metodo. I mutex sono legati ai thread; cioè, un mutex può essere rilasciato solo dal thread che lo possiede. Se un thread rilascia un mutex di cui non è proprietario, viene generata un'eccezione ApplicationException nel thread.

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

Se un thread è proprietario di un Mutex, tale thread può specificare lo stesso Mutex nelle chiamate ripetute di richiesta di attesa senza bloccarne l'esecuzione; tuttavia, deve rilasciare il Mutex lo stesso numero di volte per cedere la proprietà.

Mutex abbandonati

Se un thread termina senza rilasciare il Mutex oggetto, si dice che il mutex venga abbandonato. Questo spesso indica un errore di programmazione grave perché la risorsa che protegge il mutex potrebbe essere lasciata in uno stato incoerente. Viene AbandonedMutexException lanciato nel thread successivo che acquisisce il mutex.

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

Mutex locali e di sistema

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

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

Protezione del controllo di accesso per i mutex di sistema

.NET Framework consente di eseguire query e impostare la sicurezza del controllo di accesso di Windows per gli oggetti di sistema denominati. La protezione dei mutex di sistema dal momento della creazione è consigliata perché gli oggetti di sistema sono globali e pertanto possono essere bloccati da codice diverso dal proprio.

Per informazioni sulla sicurezza del controllo di accesso per i mutex, consultare 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).

Annotazioni

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

Vedere anche