Mutexes
Você pode usar um objeto Mutex para fornecer acesso exclusivo a um recurso. A classe Mutex usa mais recursos do sistema do que a classe Monitor, mas pode realizar marshalling entre limites de domínio de aplicativo, pode ser usada com vários esperas e pode ser usada para sincronizar threads em processos diferentes. Para obter uma comparação dos mecanismos de sincronização gerenciados, confira Visão geral dos primitivos de sincronização.
Para obter exemplos de código, consulte a documentação de referência para os construtores Mutex.
Usar 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 thread; ou seja, o mutex pode ser liberado somente pelo thread ao qual pertence. 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 grave de programação, pois 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 objeto Mutex um construtor que aceita um nome, ele será associado a um objeto do sistema operacional com esse 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 referência ao objeto Mutex local. Cada objeto Mutex é um mutex local separado.
Segurança do controle de acesso para mutexes de sistema
O .NET Framework permite a consulta e definição da segurança de controle de acesso do Windows para objetos de sistema nomeados. 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 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).
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+.