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 de thread; ou seja, o mutex só pode ser liberado pelo thread 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 um thread possui um Mutex, esse thread pode especificar o mesmo Mutex em chamadas repetidas de solicitação de espera sem bloquear sua execução, no entanto, ele deve liberar o quantas vezes para liberar a Mutex propriedade.

Mutexes abandonados

Se um thread termina sem liberar um Mutex, o mutex é dito ser 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 em todo o sistema, um mutex abandonado pode indicar que um aplicativo foi encerrado abruptamente (por exemplo, usando o Gerenciador 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 OpenExisting método 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 controle de acesso 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 um código diferente do seu.

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

Nota

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

Consulte também