Warum Mutex anstelle der booleschen Variablen für die Thread-Synchronisation verwenden?

8

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.

    
BSalunke 23.10.2013, 06:11
quelle

4 Antworten

6

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.

    
Jim Mischel 23.10.2013 16:49
quelle
2
%Vor%

Dieser Code ist falsch, weil zwei Threads gleichzeitig 0 in der gesperrten Variablen sehen können und denkt, dass sie die Sperre haben.

    
manuell 23.10.2013 07:37
quelle
1

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 .

    
NPE 23.10.2013 06:15
quelle
1

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.

    
David Schwartz 23.10.2013 06:17
quelle