Compartilhar via


Mutexes

Você pode usar um Mutex objeto para fornecer acesso exclusivo a um recurso. A Mutex classe usa mais recursos do sistema do que a Monitor classe, mas pode ser distribuída entre limites de domínio do aplicativo, pode ser usada com várias esperas e pode ser usada para sincronizar threads em processos diferentes. Para obter uma comparação dos mecanismos de sincronização gerenciada, consulte Visão geral dos primitivos de sincronização.

Para obter exemplos de código, consulte a documentação de referência para os Mutex construtores.

Utilize mutexes

Um thread chama o método WaitOne de um mutex para solicitar a propriedade. A chamada fica bloqueada até que o mutex esteja disponível, ou até que o intervalo de tempo limite opcional expire. O estado de um mutex será sinalizado se nenhum thread for seu proprietário.

Um thread libera um mutex chamando seu método ReleaseMutex. Os mutexes têm afinidade de segmento; ou seja, o mutex só pode ser liberado pelo segmento que o possui. Se um thread liberar um mutex do qual não é proprietário, uma ApplicationException será gerada no 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.

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.

Mutexes abandonados

Se um thread é encerrado sem liberar um Mutex, diz-se que o mutex está abandonado. Isso geralmente indica um erro de programação grave porque o recurso que o mutex está protegendo pode ser deixado em um estado inconsistente. Uma AbandonedMutexException é gerada no próximo thread que adquire o 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).

Mutexes locais e do sistema

Há dois tipos de mutexes: mutexes locais e mutexes de sistema nomeados. Se você criar um Mutex objeto usando um construtor que aceita um nome, ele será associado a um objeto do sistema operacional desse nome. Os mutexes de sistema nomeados são visíveis em todo o sistema operacional e podem ser usados para sincronizar as atividades dos processos. 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.

Um mutex local existe somente dentro de seu processo. Ele pode ser usado por qualquer thread em seu processo que tenha uma referência ao objeto local Mutex . Cada Mutex objeto é um mutex local separado.

Segurança do controle de acesso para mutexes de sistema

O .NET Framework fornece a capacidade de consultar e definir a segurança de controle de acesso do Windows para objetos nomeados do sistema. 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.

Para obter informações sobre a segurança do controle de acesso para mutexes, consulte 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).

Observação

A segurança do controle de acesso para mutexes do sistema só está disponível com .NET Framework, não está disponível com .NET Core ou .NET 5+.

Consulte também