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 sinalizado quando é de propriedade. Apenas um thread de cada vez pode possuir 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 evitar 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 o CreateMutex ou função de 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çãoOpenMutex. Para passar um identificador para um mutex sem nome para outro processo, use a função DuplicateHandle ou 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 for de propriedade de outro thread, a função wait bloqueará o thread solicitante até que o thread proprietário libere o objeto mutex usando a funçãoReleaseMutex. O valor de retorno da função wait 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 em um mutex, um thread em espera será selecionado. Não assuma uma ordem FIFO (first-in, first-out). Eventos externos, como APCs de 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 funções de espera sem bloquear sua execução. Isso evita que um thread se bloqueie enquanto espera por 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 satisfez as condições de uma função de espera.
Se um thread termina sem liberar sua propriedade de um objeto mutex, o objeto mutex é considerado abandonado. Um thread em espera pode adquirir a propriedade de um objeto mutex abandonado, mas a função wait 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 prosseguir 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 restaura o comportamento normal se um identificador para o objeto mutex for especificado subsequentemente em uma função de espera.
Observe que objetos de seção crítica fornecer sincronização semelhante à fornecida por objetos mutex, exceto que os objetos de seção crítica podem ser usados apenas pelos threads de um único processo.
Tópicos relacionados