Ein Mutex ist ein Programmierkonzept, das häufig zur Lösung von Multithreading-Problemen verwendet wird. Meine Frage an die Community:
Was ist ein Mutex und wie verwendet man ihn?
Ein Mutex ist ein Programmierkonzept, das häufig zur Lösung von Multithreading-Problemen verwendet wird. Meine Frage an die Community:
Was ist ein Mutex und wie verwendet man ihn?
Wenn ich bei der Arbeit eine hitzige Diskussion habe, benutze ich ein Gummihuhn, das ich für solche Gelegenheiten in meinem Schreibtisch aufbewahre. Die Person, die das Huhn hält, ist die einzige Person, die sprechen darf. Wenn man das Huhn nicht in der Hand hält, darf man nicht sprechen. Man kann nur andeuten, dass man das Huhn will, und warten, bis man es bekommt, bevor man spricht. Wenn Sie mit dem Sprechen fertig sind, können Sie das Huhn dem Moderator zurückgeben, der es an die nächste Person weitergibt, die sprechen soll. Auf diese Weise wird sichergestellt, dass die Teilnehmer nicht übereinander sprechen und auch ihren eigenen Raum zum Sprechen haben.
Ersetzen Sie "Chicken" durch "Mutex" und "Person" durch "Thread", und Sie haben im Grunde das Konzept eines Mutex.
Natürlich gibt es so etwas wie ein Gummi-Mutex nicht. Nur Gummihühner. Meine Katzen hatten einmal eine Gummimaus, aber sie haben sie gefressen.
Bevor man das Gummihuhn einsetzt, muss man sich natürlich fragen, ob man wirklich fünf Personen in einem Raum braucht, und ob es nicht einfacher wäre, wenn eine Person allein im Raum wäre und die ganze Arbeit erledigen würde. Eigentlich ist dies nur eine Erweiterung der Analogie, aber Sie verstehen die Idee.
Ein Mutex ist ein Mut ual ex klusive Flagge. Es fungiert als Torwächter für einen Abschnitt des Codes, der einem Thread den Zugang erlaubt und alle anderen blockiert. Dadurch wird sichergestellt, dass der kontrollierte Code jeweils nur von einem einzigen Thread aufgerufen wird. Stellen Sie nur sicher, dass Sie den Mutex wieder freigeben, wenn Sie fertig sind :)
Mut ual Ex clusion. Hier ist der Wikipedia-Eintrag dazu.
Der Sinn eines Mutex ist es, zwei Threads zu synchronisieren. Wenn zwei Threads versuchen, auf eine einzelne Ressource zuzugreifen, besteht das allgemeine Muster darin, dass der erste Codeblock, der den Zugriff versucht, den Mutex setzt, bevor er den Code eingibt. Wenn der zweite Codeblock versucht, auf die Ressource zuzugreifen, stellt er fest, dass der Mutex gesetzt ist, und wartet, bis der erste Codeblock abgeschlossen ist (und den Mutex zurücksetzt), und fährt dann fort.
Wie dies im Einzelnen geschieht, ist natürlich je nach Programmiersprache sehr unterschiedlich.
Bei einer Multithreading-Anwendung teilen sich die verschiedenen Threads manchmal eine gemeinsame Ressource, z. B. eine Variable oder ähnliches. Auf diese gemeinsame Quelle kann oft nicht gleichzeitig zugegriffen werden, so dass ein Konstrukt erforderlich ist, um sicherzustellen, dass jeweils nur ein Thread diese Ressource verwendet.
Das Konzept heißt "gegenseitiger Ausschluss" (kurz Mutex) und stellt sicher, dass sich nur ein Thread in diesem Bereich aufhalten und diese Ressource nutzen darf usw.
Wie sie zu verwenden sind, ist sprachspezifisch, basiert aber oft (wenn auch nicht immer) auf einem Mutex des Betriebssystems.
Einige Sprachen benötigen dieses Konstrukt aufgrund ihres Paradigmas nicht, zum Beispiel die funktionale Programmierung (Haskell, ML sind gute Beispiele).
Was ist ein Mutex ?
Der Mutex (eigentlich ist der Begriff Mutex die Abkürzung für Mutual Exclusion), auch bekannt als Spinlock, ist das einfachste Synchronisationswerkzeug, das zum Schutz kritischer Bereiche und somit zur Vermeidung von Wettlaufsituationen verwendet wird. Das heißt, dass ein Thread eine Sperre erwerben muss, bevor er in einen kritischen Abschnitt eintritt (im kritischen Abschnitt teilen sich mehrere Threads eine gemeinsame Variable, aktualisieren eine Tabelle, schreiben eine Datei usw.), und er gibt die Sperre frei, wenn er den kritischen Abschnitt verlässt.
Was ist ein Rennen Bedingung ?
Eine Race Condition tritt auf, wenn zwei oder mehr Threads auf gemeinsame Daten zugreifen können und versuchen, sie gleichzeitig zu ändern. Da der Thread-Planungsalgorithmus jederzeit zwischen den Threads wechseln kann, wissen Sie nicht, in welcher Reihenfolge die Threads versuchen werden, auf die gemeinsamen Daten zuzugreifen. Daher hängt das Ergebnis der Datenänderung vom Thread-Scheduling-Algorithmus ab, d. h. beide Threads "rennen" um den Zugriff auf die Daten bzw. deren Änderung.
Ein Beispiel aus dem wirklichen Leben:
Wenn ich bei der Arbeit eine hitzige Diskussion habe, benutze ich ein Gummi Huhn, das ich für solche Gelegenheiten in meinem Schreibtisch aufbewahre. Die Person Die Person, die das Huhn hält, ist die einzige Person, die sprechen darf. Wenn Sie das Huhn nicht in der Hand hält, darf man nicht sprechen. Sie können nur andeuten, dass Sie können nur andeuten, dass Sie das Huhn wollen, und warten, bis Sie es bekommen, bevor Sie sprechen. Sobald können Sie das Huhn an den Moderator zurückgeben. Moderator zurückgeben, der es an die nächste Person weitergibt. So wird sichergestellt dass die Leute nicht übereinander sprechen und auch ihren eigenen Raum zum Reden.
Ersetzen Sie "Chicken" durch "Mutex" und "Person" durch "Thread", und Sie haben im Grunde das Konzept eines Mutex.
@Xetius
Verwendung in C#:
Dieses Beispiel zeigt, wie ein lokales Mutex-Objekt verwendet wird, um den Zugriff auf eine geschützte Ressource zu synchronisieren. Da jeder aufrufende Thread blockiert wird, bis er den Besitz des Mutex erwirbt, muss er die Methode ReleaseMutex aufrufen, um den Besitz des Threads freizugeben.
using System;
using System.Threading;
class Example
{
// Create a new Mutex. The creating thread does not own the mutex.
private static Mutex mut = new Mutex();
private const int numIterations = 1;
private const int numThreads = 3;
static void Main()
{
// Create the threads that will use the protected resource.
for(int i = 0; i < numThreads; i++)
{
Thread newThread = new Thread(new ThreadStart(ThreadProc));
newThread.Name = String.Format("Thread{0}", i + 1);
newThread.Start();
}
// The main thread exits, but the application continues to
// run until all foreground threads have exited.
}
private static void ThreadProc()
{
for(int i = 0; i < numIterations; i++)
{
UseResource();
}
}
// This method represents a resource that must be synchronized
// so that only one thread at a time can enter.
private static void UseResource()
{
// Wait until it is safe to enter.
Console.WriteLine("{0} is requesting the mutex",
Thread.CurrentThread.Name);
mut.WaitOne();
Console.WriteLine("{0} has entered the protected area",
Thread.CurrentThread.Name);
// Place code to access non-reentrant resources here.
// Simulate some work.
Thread.Sleep(500);
Console.WriteLine("{0} is leaving the protected area",
Thread.CurrentThread.Name);
// Release the Mutex.
mut.ReleaseMutex();
Console.WriteLine("{0} has released the mutex",
Thread.CurrentThread.Name);
}
}
// The example displays output like the following:
// Thread1 is requesting the mutex
// Thread2 is requesting the mutex
// Thread1 has entered the protected area
// Thread3 is requesting the mutex
// Thread1 is leaving the protected area
// Thread1 has released the mutex
// Thread3 has entered the protected area
// Thread3 is leaving the protected area
// Thread3 has released the mutex
// Thread2 has entered the protected area
// Thread2 is leaving the protected area
// Thread2 has released the mutex
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
3 Stimmen
Hier ist ein guter Artikel über den Unterschied: barrgroup.com/Embedded-Systems/How-To/RTOS-Mutex-Semaphore
0 Stimmen
Ein Tutorial über Mutex kann helfen, die Dinge zu klären: stackoverflow.com/questions/4989451/mutex-beispiel-tutorial
72 Stimmen
Ein Mutex ist wie ein Toilettenschlüssel an einer Tankstelle, der sicherstellt, dass immer nur eine Person die Toilette benutzen kann UND dass niemand anderes die Toilette benutzen kann, bis der aktuelle Benutzer fertig ist und den Schlüssel zurückgibt.