4 Stimmen

Ist es notwendig, einen Mutex für einen schreibgeschützten Thread und einen schreibgeschützten Thread zu erstellen?

Es gibt 2 Threads, einer liest nur das Signal, der andere setzt nur das Signal.

Ist es notwendig, einen Mutex für das Signal zu erstellen und warum?

UPDATE

Alles, worum ich mich kümmere, ist, ob es abstürzen wird, wenn zwei Threads zur gleichen Zeit lesen/setzen

3voto

WhirlWind Punkte 13556

Sie werden wahrscheinlich atomare Variablen dafür verwenden wollen, obwohl ein Mutex auch funktionieren würde.

Das Problem ist, dass es keine Garantie dafür gibt, dass die Daten zwischen den Threads synchron bleiben, aber die Verwendung atomarer Variablen stellt sicher, dass sobald ein Thread diese Variable aktualisiert, andere Threads sofort den aktualisierten Wert lesen.

Ein Problem könnte auftreten, wenn ein Thread die Variable im Cache aktualisiert und ein zweiter Thread die Variable aus dem Speicher liest. Dieser zweite Thread würde einen veralteten Wert für die Variable lesen, wenn der Cache noch nicht in den Speicher geschrieben wurde. Atomare Variablen stellen sicher, dass der Wert der Variable konsistent über die Threads hinweg ist.

Wenn Sie sich nicht um zeitnahe Variableaktualisierungen kümmern, könnten Sie möglicherweise mit einer einzelnen volatilen Variablen auskommen.

1voto

Jay Punkte 8984

Es kommt darauf an. Wenn Schreibvorgänge atomar sind, benötigen Sie keinen gegenseitigen Ausschluss. Wenn Schreibvorgänge nicht atomar sind, benötigen Sie jedoch eine Sperre.

Es besteht auch das Problem, dass Compiler Variablen im CPU-Cache zwischenspeichern können, was dazu führen kann, dass die Kopie im Hauptspeicher nicht bei jedem Schreibvorgang aktualisiert wird. Einige Sprachen bieten Möglichkeiten, dem Compiler mitzuteilen, dass eine Variable nicht im CPU zwischengespeichert werden soll (volatile Schlüsselwort in Java), oder dem Compiler mitzuteilen, dass alle zwischengespeicherten Werte mit dem Hauptspeicher synchronisiert werden sollen (synchronized Schlüsselwort in Java). Mutexe im Allgemeinen lösen dieses Problem jedoch nicht.

0voto

Mark M Punkte 1435

Wenn alles, was Sie benötigen, die Synchronisierung zwischen Threads ist (ein Thread muss etwas beenden, bevor der andere mit etwas anderem beginnen kann), dann sollte gegenseitiger Ausschluss nicht notwendig sein.

Gegenseitiger Ausschluss ist nur notwendig, wenn Threads einige Ressourcen teilen, wo die Ressource beschädigt werden könnte, wenn sie beide gleichzeitig durch den kritischen Abschnitt laufen. Denken Sie an zwei Personen, die ein Bankkonto teilen und gleichzeitig an zwei verschiedenen Geldautomaten sind.

Je nach Ihrer Sprache/Threading-Bibliothek können Sie den gleichen Mechanismus sowohl für die Synchronisierung als auch für den gegenseitigen Ausschluss verwenden - entweder ein Semaphor oder ein Monitor. Wenn Sie also Pthreads verwenden, könnte hier jemand ein Beispiel für Synchronisierung und ein weiteres für gegenseitigen Ausschluss posten. Wenn es Java ist, gäbe es ein anderes Beispiel. Vielleicht können Sie uns sagen, welche Sprache/Bibliothek Sie verwenden.

0voto

Jerry Coffin Punkte 452852

Wenn, wie Sie in Ihrem Bearbeitungsvorgang gesagt haben, Sie nur gegen einen Absturz absichern möchten, müssen Sie eigentlich nicht viel tun (zumindest im Allgemeinen). Wenn es zu einer Kollision zwischen Threads kommt, ist das Schlimmste, was passieren kann, dass die Daten beschädigt werden - z.B. könnte der Leser einen Wert erhalten, der teilweise aktualisiert wurde und nicht direkt einem Wert entspricht, den der schreibende Thread jemals geschrieben hat. Das klassische Beispiel wäre eine mehrbyte-Zahl, zu der etwas hinzugefügt wurde, und es gab ein Übertragsbit (zum Beispiel) der alte Wert war 0x3f ffff, der inkrementiert wurde. Es ist möglich, dass der Lesethread 0x3f 0000 sieht, wobei die unteren 16 Bits inkrementiert wurden, aber der Übertrag zu den oberen 16 Bits noch nicht stattgefunden hat.

Auf einer modernen Maschine wird ein Inkrement auf so einem kleinen Datenelement normalerweise atomar sein, aber es wird eine Größe (und Ausrichtung) geben, bei der es nicht der Fall ist - typischerweise, wenn ein Teil der Variablen in einer Cache-Zeile ist und ein anderer Teil in einer anderen, wird es nicht mehr atomar sein. Die genaue Größe und Ausrichtung dafür variiert etwas, aber die Grundidee bleibt die gleiche - es kommt im Wesentlichen darauf an, dass die Zahl genug Ziffern hat, damit so etwas passieren kann.

Natürlich könnte etwas wie das, wenn Sie nicht vorsichtig sind, dazu führen, dass Ihr Code sich blockiert oder etwas in dieser Art passiert - ohne zu wissen, wie Sie die Daten verwenden möchten, ist es unmöglich zu erraten, was passieren könnte.

CodeJaeger.com

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.

Powered by:

X