Question Qu'est-ce qu'un mutex?


Un mutex est un concept de programmation fréquemment utilisé pour résoudre des problèmes de multithreading. Ma question à la communauté:

Qu'est-ce qu'un mutex et comment l'utilisez-vous?


484
2017-08-29 15:59


origine


Réponses:


Lorsque je suis en pleine discussion au travail, j'utilise un poulet en caoutchouc que je garde dans mon bureau pour de telles occasions. La personne qui tient le poulet est la seule personne autorisée à parler. Si vous ne tenez pas le poulet, vous ne pouvez pas parler. Vous pouvez seulement indiquer que vous voulez le poulet et attendre jusqu'à ce que vous l'obteniez avant de parler. Une fois que vous avez fini de parler, vous pouvez remettre le poulet au modérateur qui le remettra à la personne suivante. Cela garantit que les gens ne parlent pas les uns aux autres, et ont aussi leur propre espace pour parler.

Remplacer le poulet avec Mutex et la personne avec du fil et vous avez essentiellement le concept d'un mutex.

Bien sûr, il n'y a pas de mutex en caoutchouc. Seulement du poulet en caoutchouc. Mes chats ont déjà eu une souris en caoutchouc, mais ils l'ont mangée.

Bien sûr, avant d'utiliser le poulet en caoutchouc, vous devez vous demander si vous avez vraiment besoin de 5 personnes dans une même pièce et si ce n'est pas plus facile avec une seule personne dans la pièce de faire tout le travail. En fait, cela ne fait que prolonger l'analogie, mais vous avez l'idée.


1710
2017-08-29 16:07



Un Mutex est un drapeau mutuellement exclusif. Il agit comme un gardien de porte à une section de code permettant un fil dans et bloquer l'accès à tous les autres. Cela garantit que le code contrôlé ne sera touché que par un seul thread à la fois. Veillez simplement à libérer le mutex lorsque vous avez terminé. :)


82
2017-08-29 16:06



Exclusion mutuelle. Voici l'entrée de Wikipedia:

http://en.wikipedia.org/wiki/Mutual_exclusion

Le but d'un mutex est de synchroniser deux threads. Lorsque vous avez deux threads qui tentent d'accéder à une ressource unique, le modèle général consiste à faire en sorte que le premier bloc de code tente d'accéder au réglage du mutex avant d'entrer le code. Lorsque le second bloc de code tente d'accéder, il voit que le mutex est défini et attend que le premier bloc de code soit terminé (et dé-mets le mutex), puis continue.

Les détails spécifiques de la façon dont ceci est accompli varient évidemment beaucoup selon le langage de programmation.


63
2017-08-29 16:05



Lorsque vous avez une application multithread, les différents threads partagent parfois une ressource commune, telle qu'une variable ou similaire. Il est souvent impossible d'accéder à cette source partagée en même temps. Une construction est donc nécessaire pour garantir qu'un seul thread utilise cette ressource à la fois.

Le concept est appelé "exclusion mutuelle" (court Mutex), et est un moyen de s'assurer qu'un seul thread est autorisé à l'intérieur de cette zone, en utilisant cette ressource, etc.

La façon de les utiliser est spécifique à la langue, mais est souvent (si ce n'est toujours) basée sur un système opérationnel mutex.

Certains langages n'ont pas besoin de cette construction, à cause du paradigme, par exemple la programmation fonctionnelle (Haskell, ML sont de bons exemples).

Maintenant, allez demander à Google comment les utiliser! :)


38
2017-08-29 16:04



En C #, le mutex commun utilisé est le Moniteur. Le type est 'System.Threading.Monitor'. Il peut également être utilisé implicitement via le 'verrouiller (objet)'déclaration. Un exemple de son utilisation est lors de la construction d'une classe Singleton.

private static readonly Object instanceLock = new Object();
private static MySingleton instance;
public static MySingleton Instance
{
    lock(instanceLock)
    {
        if(instance == null)
        {
            instance = new MySingleton();
        }
        return instance;
    }
}

L'instruction de verrouillage utilisant l'objet de verrouillage privé crée une section critique. Exiger que chaque thread attende la fin du précédent. Le premier thread entrera dans la section et initialisera l'instance. Le second thread attendra, entrera dans la section et récupérera l'instance initialisée.

Toute sorte de synchronisation d'un membre statique peut utiliser la déclaration de verrouillage de la même manière.


25
2017-08-29 16:11



Pour comprendre MUTEX dans un premier temps, vous devez savoir quelle est la "condition de course" et vous comprendrez alors pourquoi MUTEX est nécessaire. Supposons que vous ayez un programme multi-threading et que vous ayez deux threads. Maintenant, vous avez un travail dans la file d'attente. Le premier thread vérifiera la file d'attente et après avoir trouvé le travail, il commencera à l'exécuter. Le second thread vérifie également la file d'attente et constate qu'il y a un travail dans la file d'attente. Ainsi, il attribuera également le même pointeur de tâche. Donc, maintenant ce qui se passe, les deux threads exécutent le même travail. Cela provoquera une erreur de segmentation. Ceci est l'exemple d'une condition de course.

La solution à ce problème est MUTEX. MUTEX est une sorte de verrou qui verrouille un fil à la fois. Si un autre thread veut le verrouiller, le thread est simplement bloqué.

Le sujet MUTEX dans ce fichier pdf le lien vaut vraiment la peine d'être lu.


12
2018-06-27 09:57



Les mutex sont utiles dans les situations où vous devez appliquer un accès exclusif à une ressource à travers plusieurs processus, où un verrou régulier n'aidera pas, car il ne fonctionne que sur les threads.


11
2017-09-02 18:57



Il y a quelques bonnes réponses ici, voici une autre grande analogie pour expliquer ce que mutex est:

Considérer unique toilettes avec un clé. Quand quelqu'un entre, ils prennent la clé et la toilette est occupé. Si quelqu'un d'autre a besoin d'utiliser les toilettes, il doit attendre dans un queue. Quand la personne dans les toilettes est terminé, ils transmettent la clé à la personne suivante en file d'attente. Faites du sens, non?

Convertir le toilette dans l'histoire à un ressource partagée, et le clé à un mutex. Prendre la clé de la toilette (acquérir un verrou) vous permet de l'utiliser. S'il n'y a pas de clé (le verrou est verrouillé), vous devez attendre. Lorsque la clé est retournée par la personne (libérer le verrou) vous êtes libre de l'acquérir maintenant.


11
2017-10-09 08:54