Objetos Mutex
Um objeto mutex é um objeto de sincronização cujo estado é definido como sinalizado quando ele não pertence a nenhum thread e não atribuído quando ele é propriedade. Apenas um thread de cada vez pode ter um objeto mutex, cujo nome vem do fato de que ele é útil na coordenação do 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 de Sincronização de Interprocessos.
Os threads em outros processos podem abrir um identificador para um objeto mutex nomeado existente especificando seu nome em uma chamada para a funçãoopenMutex. Para passar um identificador para um mutex sem nome para outro processo, use a funçãoDuplicateHandle ou a herança do 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 de solicitação 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 definido como sinalizado.
Se mais de um thread estiver aguardando um mutex, um thread de espera será selecionado. Não suponha uma ordem FIFO (primeiro a entrar e 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 o de funções de espera sem bloquear sua execução. Isso impede que um thread se bloqueie enquanto aguarda um mutex que ele já possui. Para liberar sua propriedade em tais circunstâncias, o thread deve chamar ReleaseMutex uma vez para cada vez que o mutex satisfizesse as condições de uma função de espera.
Se um thread for encerrado sem liberar sua propriedade de um objeto mutex, o objeto mutex será considerado abandonado. Um thread de 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 está 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 após 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.
Tópicos relacionados