Welchen Teil des Speichers sperrt ein Mutex? (Pthreads)

7

Die gesamte Dokumentation, die ich über den pthreads mutex gelesen habe, besagt nur, dass ein Mutex verhindert, dass mehrere Threads auf Shared Memory zugreifen, aber wie spezifiziert man im Programm, was genau das ist? Sind es alle globalen Variablen im Programm, auf die Variablen zwischen den Funktionen zum Sperren und Entsperren zugegriffen wird, oder ...? Alles, was ich auf Pthreads gefunden habe, einschließlich der Beispiele, ist irritierend vage.

    
dreta 03.10.2013, 08:04
quelle

7 Antworten

16
  

Ein Mutex verhindert, dass mehrere Threads auf den gemeinsamen Speicher zugreifen

Das obige ist eine falsche Aussage. An sich tut ein Mutex das nicht. Dadurch können Sie Code erstellen, der verhindert, dass mehrere Threads gleichzeitig auf gemeinsam genutzten Speicher oder andere Ressourcen zugreifen können. Es wird jedoch nichts selbst gesperrt.

Sie können ein Programm erstellen, das einen Mutex verwendet, um zu verhindern, dass mehrere Threads gleichzeitig bestimmte Codeabschnitte ausführen. Wenn diese Codeabschnitte zufällig auf eine gemeinsam genutzte Speicherregion zugreifen und kein anderer Code versuchen würde, gleichzeitig auf diese Region zuzugreifen, ohne den Mutex zu sperren, würde dies bewirken, dass diese Speicherregion "gesperrt" wird.

    
dasblinkenlight 03.10.2013, 08:13
quelle
8

Ein Mutex sperrt keinen Speicher, er "sperrt" einen Teil der Ausführung Pfad und synchronisiert den Speicher (aber wann und wann Entriegeln). Was garantiert ist, dass wenn ein Thread den Mutex, keine anderen Threads können es und jeden Thread erwerben Der Versuch, es zu erwerben, wird blockiert, bis es freigegeben wird.

Es ist auch garantiert, dass irgendwelche Speicherzugriffe (lesen oder schreiben) wird in Bezug auf den Erwerb oder die Freilassung der bestellt werden Mutex; mit anderen Worten, dass alle Lesevorgänge während des Mutex durchgeführt werden held wird alle Änderungen widerspiegeln, die vor dem Erwerb des Mutex vorgenommen wurden (einschließlich solcher, die in einem anderen Thread gemacht wurden), und zwar alle Änderungen, die während des Haltens des Mutex vorgenommen werden, sind potentiell Spätestens wenn der Mutex aktiviert ist, ist er für alle anderen Threads sichtbar freigegeben. (Die anderen Threads werden natürlich sicherstellen müssen dass ihr Speicher liest aktuelle Werte sehen, damit dies funktioniert.)

Für weitere Informationen sollten Sie Programmieren mit POSIX-Threads lesen , von David Butenhof. Es ist die Referenz und erklärt sie im Detail.

    
James Kanze 03.10.2013 08:13
quelle
3

Streng genommen sperrt / entsperrt sich ein Mutex nur selbst. Welche freigegebenen Ressourcen geschützt werden, hängt vollständig davon ab, wie Sie sie verwenden. Sie verwenden Mutexe (oder allgemeiner alle Synchronisationsgrundelemente), um ein Protokoll für sich selbst zu erstellen, um sicher auf freigegebene Ressourcen wie Daten zuzugreifen.

Sie haben beispielsweise ein Array double d[10] , auf das von verschiedenen Threads zugegriffen werden soll. Um dies vor gleichzeitigen Änderungen zu schützen, können Sie einen Mutex erstellen, sagen wir mutex_for_d , und Ihren Code so programmieren, dass jedes Mal, wenn Code auf d zugreift, mutex_for_d zuerst gesperrt wird. Auf diese Weise ist der Zugriff auf d durch den Mutex geschützt.

Alternativ können Sie festlegen, dass jedes Element des Arrays separat synchronisiert wird und über ein Array von Mutex-Elementen verfügt, die immer das Element für das Element sperren, auf das Sie zugreifen.

Dies ist Ihr eigenes Protokoll und Sie müssen darauf achten, dass Sie sich daran halten. Wenn Sie vergessen, den Mutex in einer Funktion zu sperren, die d ändert, wird das Programm weiterhin ausgeführt, kann aber möglicherweise ein Datenrennen einleiten. Aus diesem Grund werden Sie normalerweise geteilte Daten hinter einer Klassenschnittstelle verstecken wollen, die eine korrekte Sperrung garantieren, etwa so:

%Vor%     
Angew 03.10.2013 08:18
quelle
1

Siehe diesen Code:

%Vor%

Wie Sie sehen, sind die Variablen initialized_array und some_array tief miteinander verwandt, aber die Beziehung existiert nur im Code, der beide behandelt.

So sind Mutexe mit gemeinsam genutztem Speicher verbunden; Die Zuordnung geschieht, weil Sie Code schreiben, der dies tut. Es gibt keine Möglichkeit zu sagen "Dieser Mutex schützt dieses gemeinsame Objekt", der Programmierer muss sicherstellen, dass jedes Mal, wenn auf das gemeinsame Objekt von einem Thread zugegriffen wird, auch die Synchronisation auf dem richtigen Mutex durchgeführt wird.

    
DanielKO 03.10.2013 08:12
quelle
1

Wenn ein Mutex gesperrt ist, verhindert er, dass ein anderer Thread eine Sperre für denselben Mutex erhält. Wenn also bestimmte Daten threadsicher sein sollen (d. H. Ein kritischer Speicherabschnitt), sollten Sie eine Sperre für den Mutex erhalten, bevor Sie von ihm lesen oder darauf schreiben und dann die Sperre aufheben, wenn Sie fertig sind. Der Mutex selbst bezieht sich nicht auf einen bestimmten Abschnitt des Speichers. Es ist einfach ein Werkzeug, das Sie verwenden können.

    
Dave 03.10.2013 08:13
quelle
1

Mutex sperrt ein Stück Code. Zum Beispiel:

%Vor%

Wenn ein Thread den obigen Code eingibt, wird er gesperrt, bis er fertig ist. Zur gleichen Zeit kann kein anderer Thread diesen Code ausführen.

Mutex- und Thread-Unabhängigkeit

    
cpp 03.10.2013 08:13
quelle
1

Ein Mutex sperrt sich selbst und das ist alles, was es sperrt. Es sperrt keinen anderen Speicher, es sperrt keinen Code. Sie können Ihren Code so gestalten, dass etwas anderes als nur der Mutex geschützt wird, aber das hängt davon ab, wie Sie den Code entwerfen, nicht eine Eigenschaft des Mutex selbst.

Sie können erkennen, dass der Datenspeicher nicht gesperrt ist, weil Sie den Speicher frei ändern können, wenn der Mutex von jemand anderem gesperrt wird, nur indem Sie den Mutex nicht verwenden:

%Vor%

Zu sagen, dass es Code sperrt, ist auch nicht ganz richtig, da Sie alle Arten von verschiedenen Code-Abschnitten unter der Kontrolle eines einzelnen Mutex ausführen können.

Und wenn jemand den Code innerhalb eines Mutex-Blocks erreicht, ohne zuerst den Mutex zu beanspruchen, kann er den Code frei ausführen, selbst wenn jemand den Mutex gesperrt hat:

%Vor%     
paxdiablo 03.10.2013 08:16
quelle

Tags und Links