Ich versuche die Multithreading-Programmierung in C zu verstehen.
Ich bezweifle, dass wir, da wir MUTEXES für die Thread-Synchronisation verwenden, die Boolesche Variable nicht verwenden können, um den kritischen Bereich des auszuführenden Codes zu blockieren.
Was ist Spezialität von Mutes über boolesche Variable?
PS: Eigentlich wurde diese Frage in einem Interview gestellt. Bitte teilen Sie Ihr Wissen dazu.
Das Problem ist, dass zwei Threads den booleschen Wert gleichzeitig als verfügbar sehen können und beide dann annehmen würden, dass es sicher ist fortzufahren.
Beispiel: Sie haben diesen Code:
%Vor% Stellen Sie sich nun vor, dass zwei Threads ausgeführt werden. Thread A liest myLock
und sieht, dass es false
ist, also geht es weiter zum nächsten Befehl. Zur selben Zeit liest Thread B myLock
und sieht, dass es false
ist, weil Thread A es noch nicht auf true
gesetzt hat. Also geht Thread B gleich weiter und nimmt auch das Schloss. An diesem Punkt führen beide Threads den Code aus, der durch eine gegenseitige Ausschlusssperre geschützt werden soll.
Es wird schlimmer, weil Thread A beendet, was es tut, und setzt mylock
zurück auf false
, während Thread B noch ausgeführt wird. Also kann ein anderer Thread mitkommen und das Schloss nehmen, obwohl Thread B noch drin ist.
Ein Mutex garantiert Atomizität. Das bedeutet, dass das Überprüfen und Aktualisieren nur durch jeweils einen Thread gleichzeitig erfolgen kann. Wenn Sie also den Boolean durch einen Mutex ersetzen, haben Sie:
%Vor%Es besteht keine Chance, dass zwei Threads den Mutex gleichzeitig aufnehmen können.
In erster Linie ist Ihr Vorschlag nicht ganz klar. Nehmen wir an, Sie haben fünf Threads, die alle um dieselbe Ressource konkurrieren. Es ist klar, wie Sie einen Mutex verwenden würden, um exklusiven Zugriff zu gewährleisten. Es ist bei weitem nicht klar, wie Sie eine boolesche Variable dafür verwenden würden.
Das heißt, boolesche Variablen können manchmal für die Synchronisation verwendet werden. Die Umstände, unter denen dies anwendbar ist, sind jedoch begrenzt, und es gibt Vorbehalte (zum Beispiel müssen solche Variablen im Allgemeinen als volatile
deklariert werden).
Mutexe sind weit mehr anwendbar. Erwähnenswert ist, dass zusätzlich zur (korrekten) Sicherstellung, dass nur ein Thread in den geschützten Bereich gelangen kann, sie auch als Speicherbarrieren
Wenn Sie versucht haben, einen Boolean als "Fake-Mutex" zu verwenden, könnte ich leicht auf Fehler in Ihrer Implementierung hinweisen, bis Sie im Grunde den Mutex neu erfunden haben. Ein Mutex ist im Grunde ein Boolescher Code mit all den zusätzlichen Dingen, die man für die Thread-Synchronisation benötigt.
Tags und Links multithreading synchronization boolean mutex