Partilhar 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 empacotada entre os limites do 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 gerenciados, consulte Visão geral das primitivas de sincronização.

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

Usar mutexes

Um thread chama o WaitOne método de um mutex para solicitar a propriedade. A chamada bloqueia até que o mutex esteja disponível ou até que o intervalo de tempo limite opcional expire. O estado de um mutex é sinalizado se nenhum thread o possuir.

Um thread libera um mutex chamando seu ReleaseMutex método. Mutexes têm afinidade com a linha de execução; ou seja, o mutex só pode ser libertado pela linha de execução que o possui. Se um thread libera um mutex que não possui, um ApplicationException é jogado no thread.

Como a classe deriva Mutex de WaitHandle, você também pode chamar a estática WaitAll ou WaitAny métodos de WaitHandle para solicitar a propriedade de um Mutex em combinação com outras alças de espera.

Se uma thread possui um Mutex, essa thread pode especificar o mesmo Mutex em chamadas repetidas de solicitação de espera sem bloquear a sua execução; no entanto, deve liberar o Mutex o mesmo número de vezes para liberar a propriedade.

Mutexes abandonados

Se uma thread termina sem liberar um Mutex, o mutex é considerado abandonado. Isso geralmente indica um erro grave de programação porque o recurso que o mutex está protegendo pode ser deixado em um estado inconsistente. Um AbandonedMutexException é lançado no próximo segmento que adquire o mutex.

No caso de um mutex a nível de sistema, um mutex abandonado pode indicar que uma aplicação foi encerrada abruptamente (por exemplo, usando o Gestor de Tarefas do Windows).

Mutexes locais e do sistema

Mutexes são de dois tipos: 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 de 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 Mutex objetos que representam o mesmo mutex de sistema nomeado e pode usar o método OpenExisting para abrir um mutex de sistema nomeado existente.

Um mutex local existe apenas dentro do 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 de acesso e controlo para mutexes do 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. Recomenda-se proteger os mutexes do sistema desde o momento da criação porque os objetos do sistema são globais e, portanto, podem ser bloqueados por código que não seja o seu.

Para obter informações sobre segurança de controle de acesso para mutexes, consulte a MutexSecurity e a MutexAccessRule classes, a enumeração MutexRights, os métodos GetAccessControl, SetAccessControl e OpenExisting da classe Mutex e o construtor Mutex(Boolean, String, Boolean, MutexSecurity).

Observação

Segurança de acesso para mutexes do sistema só está disponível com o .NET Framework, não é suportada no .NET Core ou no .NET 5+.

Ver também