Um mutex é um conceito de programação usado com freqüência para resolver problemas com vários threads. Minha pergunta para a comunidade:
O que é um mutex e como você o usa?
multithreading
concurrency
mutex
bmurphy1976
fonte
fonte
Respostas:
Quando estou tendo uma grande discussão acalorada no trabalho, uso um frango de borracha que guardo na minha mesa para essas ocasiões. A pessoa que segura o frango é a única pessoa que pode falar. Se você não segurar o frango, não poderá falar. Você só pode indicar que deseja o frango e esperar até obtê-lo antes de falar. Depois de terminar de falar, você pode devolver o frango ao moderador, que o entregará à próxima pessoa a falar. Isso garante que as pessoas não falem umas com as outras e também tenham seu próprio espaço para conversar.
Substitua Chicken por Mutex e person por thread e você basicamente tem o conceito de mutex.
Claro, não existe um mutex de borracha. Apenas frango de borracha. Meus gatos já tiveram um rato de borracha, mas eles comeram.
Obviamente, antes de usar a galinha de borracha, você precisa se perguntar se você realmente precisa de 5 pessoas em uma sala e não seria mais fácil com uma pessoa na sala sozinha fazendo todo o trabalho. Na verdade, isso está apenas estendendo a analogia, mas você entendeu.
fonte
Um Mutex é uma bandeira mutuamente exclusiva. Ele atua como guardião de uma seção de código, permitindo um encadeamento e bloqueando o acesso a todos os outros. Isso garante que o código que está sendo controlado seja atingido apenas por um único thread por vez. Apenas certifique-se de liberar o mutex quando terminar. :)
fonte
Exclusão mútua. Aqui está a entrada da Wikipedia:
http://en.wikipedia.org/wiki/Mutual_exclusion
O objetivo de um mutex é sincronizar dois threads. Quando você tem dois encadeamentos tentando acessar um único recurso, o padrão geral é ter o primeiro bloco de código tentando acessar para configurar o mutex antes de inserir o código. Quando o segundo bloco de código tenta acessar, ele vê que o mutex está definido e aguarda até que o primeiro bloco de código esteja completo (e desmarca o mutex) e continua.
Detalhes específicos de como isso é feito obviamente variam muito de acordo com a linguagem de programação.
fonte
Quando você tem um aplicativo multithread, os diferentes threads às vezes compartilham um recurso comum, como uma variável ou similar. Essa fonte compartilhada geralmente não pode ser acessada ao mesmo tempo; portanto, é necessária uma construção para garantir que apenas um encadeamento esteja usando esse recurso por vez.
O conceito é chamado de "exclusão mútua" (breve Mutex) e é uma maneira de garantir que apenas um thread seja permitido dentro dessa área, usando esse recurso etc.
Como usá-los é específico do idioma, mas geralmente (se não sempre) se baseia em um mutex do sistema operacional.
Algumas linguagens não precisam dessa construção, devido ao paradigma, por exemplo, programação funcional (Haskell, ML são bons exemplos).
fonte
Em C #, o mutex comum usado é o Monitor . O tipo é ' System.Threading.Monitor '. Também pode ser usado implicitamente através da instrução ' lock (Object) '. Um exemplo de seu uso é ao construir uma classe Singleton.
A instrução de bloqueio usando o objeto de bloqueio privado cria uma seção crítica. Exigindo que cada encadeamento aguarde até que o anterior seja concluído. O primeiro thread entrará na seção e inicializará a instância. O segundo thread aguardará, entrará na seção e obterá a instância inicializada.
Qualquer tipo de sincronização de um membro estático pode usar a instrução lock da mesma forma.
fonte
O que é um Mutex ?
O mutex (de fato, o termo mutex é abreviação de exclusão mútua), também conhecido como spinlock, é a ferramenta de sincronização mais simples usada para proteger regiões críticas e, assim, evitar condições de corrida. Ou seja, um encadeamento deve adquirir um bloqueio antes de entrar em uma seção crítica (na seção crítica, vários encadeamentos compartilham uma variável comum, atualizando uma tabela, gravando um arquivo etc.), ele libera o bloqueio quando sai da seção crítica.
O que é uma condição de corrida ?
Uma condição de corrida ocorre quando dois ou mais encadeamentos podem acessar dados compartilhados e eles tentam alterá-los ao mesmo tempo. Como o algoritmo de agendamento de encadeamentos pode alternar entre encadeamentos a qualquer momento, você não sabe a ordem em que os encadeamentos tentarão acessar os dados compartilhados. Portanto, o resultado da alteração nos dados depende do algoritmo de agendamento de threads, ou seja, os dois threads estão "correndo" para acessar / alterar os dados.
Exemplo da vida real:
Uso em C #:
Este exemplo mostra como um objeto Mutex local é usado para sincronizar o acesso a um recurso protegido. Como cada segmento de chamada é bloqueado até adquirir a propriedade do mutex, ele deve chamar o método ReleaseMutex para liberar a propriedade do segmento.
Referência MSDN Mutex
fonte
Há algumas ótimas respostas aqui, aqui está outra ótima analogia para explicar o que é mutex :
Considere banheiro único com uma chave . Quando alguém entra, eles pegam a chave e o banheiro está ocupado . Se alguém precisar usar o banheiro, precisará esperar na fila . Quando a pessoa no banheiro é feita , ela passa a chave para a próxima pessoa na fila. Faz sentido, certo?
Converta o banheiro da história em um recurso compartilhado e a chave em um mutex . Levar a chave ao banheiro (adquirir uma fechadura) permite que você a use. Se não houver uma chave (a trava está bloqueada), é preciso aguardar. Quando a chave é devolvida pela pessoa ( solte a trava ), você pode adquiri-la agora.
fonte
Para entender o MUTEX primeiro, você precisa saber o que é "condição de corrida" e só então você entenderá por que o MUTEX é necessário. Suponha que você tenha um programa multithread e você tenha dois threads. Agora, você tem um trabalho na fila de trabalhos. O primeiro encadeamento verificará a fila de trabalhos e, após encontrar o trabalho, começará a executá-lo. O segundo encadeamento também verificará a fila de trabalhos e descobrirá que há um trabalho na fila. Portanto, também atribuirá o mesmo ponteiro de trabalho. Então, agora o que acontece, os dois threads estão executando o mesmo trabalho. Isso causará uma falha de segmentação. Este é o exemplo de uma condição de corrida.
A solução para esse problema é MUTEX. MUTEX é um tipo de bloqueio que bloqueia um segmento de cada vez. Se outro encadeamento quiser travá-lo, ele simplesmente será bloqueado.
Vale a pena ler o tópico MUTEX neste link do arquivo pdf .
fonte
As mutexes são úteis em situações em que você precisa impor acesso exclusivo a um recurso em vários processos, em que um bloqueio regular não ajuda, uma vez que funciona apenas em threads.
fonte
Mutex: Mutex significa Mut ual Ex . Isso significa que por vez um processo / thread pode entrar na seção crítica. Na programação simultânea, em que vários threads / processos tentam atualizar o recurso compartilhado (qualquer variável, memória compartilhada etc.) podem levar a resultados inesperados. (Como o resultado depende de qual thread / processo obtém o primeiro acesso).
Para evitar um resultado inesperado, precisamos de algum mecanismo de sincronização, que garanta que apenas um encadeamento / processo obtenha acesso a esse recurso por vez.
A biblioteca pthread fornece suporte para o Mutex.
Essa é a estrutura para o tipo de dados mutex, ou seja, pthread_mutex_t. Quando o mutex está bloqueado, __lock está definido como 1. Quando está desbloqueado, __lock está definido como 0.
Isso garante que dois processos / threads não possam acessar a seção crítica ao mesmo tempo.
fonte