Objetos Mutex
Um objeto mutex é um objeto de sincronização cujo estado é definido como sinalizado quando não pertence a nenhum thread e não é atribuído quando pertence. Apenas um thread de cada vez pode possuir um objeto mutex, cujo nome vem do fato de que ele é útil na coordenação de acesso mutuamente exclusivo a um recurso compartilhado. Por exemplo, para impedir que dois threads gravem na memória compartilhada ao mesmo tempo, cada thread aguarda a propriedade de um objeto mutex antes de executar o código que acessa a memória. Depois de gravar na memória compartilhada, o thread libera o objeto mutex.
Um thread usa a função CreateMutex ou CreateMutexEx para criar um objeto mutex. O thread de criação pode solicitar a propriedade imediata do objeto mutex e também pode especificar um nome para o objeto mutex. Ele também pode criar um mutex sem nome. Para obter informações adicionais sobre nomes para objetos mutex, evento, semáforo e temporizador, consulte Sincronização entre processos.
Threads em outros processos podem abrir um identificador para um objeto mutex nomeado existente especificando seu nome em uma chamada para a função OpenMutex . Para passar um identificador para um mutex sem nome para outro processo, use a função DuplicateHandle ou a herança de identificador pai-filho.
Qualquer thread com um identificador para um objeto mutex pode usar uma das funções de espera para solicitar a propriedade do objeto mutex. Se o objeto mutex pertencer a outro thread, a função de espera bloqueará o thread solicitante até que o thread proprietário libere o objeto mutex usando a função ReleaseMutex . O valor retornado da função de espera indica se a função retornou por algum motivo diferente do estado do mutex que está sendo definido como sinalizado.
Se mais de um thread estiver aguardando um mutex, um thread em espera será selecionado. Não suponha uma ordem FIFO (primeiro a entrar, primeiro a sair). Eventos externos, como APCs no modo kernel, podem alterar a ordem de espera.
Depois que um thread obtém a propriedade de um mutex, ele pode especificar o mesmo mutex em chamadas repetidas para as funções de espera sem bloquear sua execução. Isso impede que um thread se coloque em deadlock enquanto aguarda um mutex que ele já possui. Para liberar sua propriedade nessas circunstâncias, o thread deve chamar ReleaseMutex uma vez para cada vez que o mutex atenda às condições de uma função de espera.
Se um thread terminar sem liberar sua propriedade de um objeto mutex, o objeto mutex será considerado abandonado. Um thread em espera pode adquirir a propriedade de um objeto mutex abandonado, mas a função de espera retornará WAIT_ABANDONED para indicar que o objeto mutex foi abandonado. Um objeto mutex abandonado indica que ocorreu um erro e que qualquer recurso compartilhado protegido pelo objeto mutex está em um estado indefinido. Se o thread continuar como se o objeto mutex não tivesse sido abandonado, ele não será mais considerado abandonado depois que o thread liberar sua propriedade. Isso restaurará o comportamento normal se um identificador para o objeto mutex for especificado posteriormente em uma função de espera.
Observe que objetos de seção críticos fornecem sincronização semelhante à fornecida por objetos mutex, exceto que objetos de seção críticos só podem ser usados pelos threads de um único processo.