MutexMutexes

È possibile usare un oggetto Mutex per fornire l'accesso esclusivo a una risorsa.You can use a Mutex object to provide exclusive access to a resource. 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.The Mutex class uses more system resources than the Monitor class, but it can be marshaled across application domain boundaries, it can be used with multiple waits, and it can be used to synchronize threads in different processes. Per un confronto dei meccanismi di sincronizzazione gestiti, vedere Panoramica sulle primitive di sincronizzazione.For a comparison of managed synchronization mechanisms, see Overview of Synchronization Primitives.

Per esempi di codice, vedere la documentazione di riferimento per i costruttori Mutex.For code examples, see the reference documentation for the Mutex constructors.

Uso dei mutexUsing Mutexes

Un thread chiama il metodo WaitOne di un mutex per richiedere la proprietà.A thread calls the WaitOne method of a mutex to request ownership. La chiamata viene bloccata finché il mutex non è disponibile o fino a quando l'intervallo di timeout facoltativo scade.The call blocks until the mutex is available, or until the optional timeout interval elapses. Lo stato di un mutex viene segnalato se nessun thread lo possiede.The state of a mutex is signaled if no thread owns it.

Un thread rilascia un mutex chiamando il relativo metodo ReleaseMutex.A thread releases a mutex by calling its ReleaseMutex method. I mutex presentano affinità di thread; vale a dire il mutex può essere rilasciato solo dal thread che ne è proprietario.Mutexes have thread affinity; that is, the mutex can be released only by the thread that owns it. Se un thread rilascia un mutex di cui non è proprietario, nel thread viene generata una ApplicationException.If a thread releases a mutex it does not own, an ApplicationException is thrown in the 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 Mutex in combinazione con altri handle di attesa.Because the Mutex class derives from WaitHandle, you can also call the static WaitAll or WaitAny methods of WaitHandle to request ownership of a Mutex in combination with other wait handles.

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à.If a thread owns a Mutex, that thread can specify the same Mutex in repeated wait-request calls without blocking its execution; however, it must release the Mutex as many times to release ownership.

Mutex abbandonatiAbandoned Mutexes

Se un thread termina senza rilasciare un Mutex, quest'ultimo si definisce abbandonato.If a thread terminates without releasing a Mutex, the mutex is said to be abandoned. Ciò indica spesso un grave errore di programmazione perché la risorsa protetta dal mutex può essere lasciata in uno stato incoerente.This often indicates a serious programming error because the resource the mutex is protecting might be left in an inconsistent state. Nella versione .NET Framework 2.0 viene generata una AbandonedMutexException nel thread successivo che acquisisce il mutex.In the .NET Framework version 2.0, an AbandonedMutexException is thrown in the next thread that acquires the mutex.

Nota

Nelle versioni .NET Framework 1.0 e 1.1 un Mutex abbandonato è impostato sullo stato segnalato e il thread in attesa successivo ottiene la proprietà.In the .NET Framework versions 1.0 and 1.1, an abandoned Mutex is set to the signaled state and the next waiting thread gets ownership. Se non c'è nessun thread in attesa, il Mutex rimane in uno stato segnalato.If no thread is waiting, the Mutex remains in a signaled state. Non viene generata alcuna eccezione.No exception is thrown.

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).In the case of a system-wide mutex, an abandoned mutex might indicate that an application has been terminated abruptly (for example, by using Windows Task Manager).

Mutex locali e di sistemaLocal and System Mutexes

Sono disponibili due tipi di mutex: i mutex locali e quelli denominati mutex di sistema.Mutexes are of two types: local mutexes and named system mutexes. Se si crea un oggetto Mutex usando un costruttore che accetta un nome, è associato a un oggetto del sistema operativo di tale nome.If you create a Mutex object using a constructor that accepts a name, it is associated with an operating-system object of that name. I mutex denominati di sistema sono visibili in tutto il sistema operativo e possono essere usati per sincronizzare le attività dei processi.Named system mutexes are visible throughout the operating system and can be used to synchronize the activities of processes. È 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.You can create multiple Mutex objects that represent the same named system mutex, and you can use the OpenExisting method to open an existing named system mutex.

Un mutex locale esiste solo all'interno del processo.A local mutex exists only within your process. Può essere usato da qualsiasi thread nel processo che abbia un riferimento all'oggetto Mutex locale.It can be used by any thread in your process that has a reference to the local Mutex object. Ogni oggetto Mutex è un mutex locale distinto.Each Mutex object is a separate local mutex.

Sicurezza del controllo di accesso per i Mutex di sistemaAccess Control Security for System Mutexes

La versione .NET Framework 2.0 offre la possibilità di eseguire query e impostare la sicurezza del controllo di accesso di Windows per gli oggetti denominati di sistema.The .NET Framework version 2.0 provides the ability to query and set Windows access control security for named system objects. 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.Protecting system mutexes from the moment of creation is recommended because system objects are global and therefore can be locked by code other than your own.

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).For information on access control security for mutexes, see the MutexSecurity and MutexAccessRule classes, the MutexRights enumeration, the GetAccessControl, SetAccessControl, and OpenExisting methods of the Mutex class, and the Mutex(Boolean, String, Boolean, MutexSecurity) constructor.

Vedere ancheSee also