MutexesMutexes

Você pode usar um objeto Mutex para fornecer acesso exclusivo a um recurso.You can use a Mutex object to provide exclusive access to a resource. A classe Mutex usa mais recursos do sistema do que a classe Monitor, mas pode realizar marshaling entre limites de domínio de aplicativo, pode ser usada com vários esperas e pode ser usada para sincronizar threads em processos diferentes.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. Para obter uma comparação dos mecanismos de sincronização gerenciados, confira Visão geral dos primitivos de sincronização.For a comparison of managed synchronization mechanisms, see Overview of Synchronization Primitives.

Para obter exemplos de código, consulte a documentação de referência para os construtores Mutex.For code examples, see the reference documentation for the Mutex constructors.

Como usar mutexesUsing Mutexes

Um thread chama o método WaitOne de um mutex para solicitar a propriedade.A thread calls the WaitOne method of a mutex to request ownership. A chamada fica bloqueada até que o mutex esteja disponível, ou até que o intervalo de tempo limite opcional expire.The call blocks until the mutex is available, or until the optional timeout interval elapses. O estado de um mutex será sinalizado se nenhum thread for seu proprietário.The state of a mutex is signaled if no thread owns it.

Um thread libera um mutex chamando seu método ReleaseMutex.A thread releases a mutex by calling its ReleaseMutex method. Os mutexes têm afinidade de thread; ou seja, o mutex pode ser liberado somente pelo thread ao qual pertence.Mutexes have thread affinity; that is, the mutex can be released only by the thread that owns it. Se um thread liberar um mutex do qual não é proprietário, uma ApplicationException será gerada no thread.If a thread releases a mutex it does not own, an ApplicationException is thrown in the thread.

Como a classe Mutex é derivada de WaitHandle, você também pode chamar os métodos estáticos WaitAll ou WaitAny de WaitHandle para solicitar a propriedade de um Mutex, em combinação com outros identificadores de espera.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 um thread possui um Mutex, esse thread pode especificar o mesmo Mutex em chamadas repetidas de solicitação e espera sem bloquear a execução; no entanto, ele deve liberar o Mutex a mesma quantidade de vezes a fim de liberar a propriedade.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.

Mutexes abandonadosAbandoned Mutexes

Se um thread é encerrado sem liberar um Mutex, diz-se que o mutex está abandonado.If a thread terminates without releasing a Mutex, the mutex is said to be abandoned. Isso geralmente indica um erro grave de programação, pois o recurso que o mutex está protegendo pode ser deixado em um estado inconsistente.This often indicates a serious programming error because the resource the mutex is protecting might be left in an inconsistent state. Um AbandonedMutexException é lançado no próximo thread que adquire o mutex.An AbandonedMutexException is thrown in the next thread that acquires the mutex.

No caso de um mutex de todo o sistema, um mutex abandonado pode indicar que um aplicativo foi finalizado abruptamente (por exemplo, usando o Gerenciador de Tarefas do 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).

Mutexes locais e do sistemaLocal and System Mutexes

Há dois tipos de mutexes: mutexes locais e mutexes de sistema nomeados.Mutexes are of two types: local mutexes and named system mutexes. Se você criar um objeto Mutex um construtor que aceita um nome, ele será associado a um objeto do sistema operacional com esse 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. Os mutexes de sistema nomeados são visíveis em todo o sistema operacional e podem ser usados para sincronizar as atividades dos processos.Named system mutexes are visible throughout the operating system and can be used to synchronize the activities of processes. Você pode criar vários objetos Mutex que representam o mesmo mutex de sistema nomeado, e você pode usar o método OpenExisting para abrir um mutex de sistema nomeado existente.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.

Um mutex local existe somente dentro de seu processo.A local mutex exists only within your process. Ele pode ser usado por qualquer thread em seu processo que tenha referência ao objeto Mutex local.It can be used by any thread in your process that has a reference to the local Mutex object. Cada objeto Mutex é um mutex local separado.Each Mutex object is a separate local mutex.

Segurança do controle de acesso para mutexes de sistemaAccess Control Security for System Mutexes

O .NET fornece a capacidade de consultar e definir a segurança de controle de acesso do Windows para objetos do sistema nomeados..NET provides the ability to query and set Windows access control security for named system objects. Recomendamos a proteção dos mutexes de sistema desde o momento da criação, pois os objetos do sistema são globais e, portanto, podem ser bloqueados por outro código além do seu.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.

Para saber mais sobre segurança de controle de acesso para mutexes, confira as classes MutexSecurity e MutexAccessRule, a enumeração MutexRights, os métodos GetAccessControl, SetAccessControl e OpenExisting da classe Mutex e o construtor 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.

Confira tambémSee also