Ist es ok, wenn mehrere threads schreiben die gleichen Werte für die gleichen Variablen?
Verstehe ich über race conditions und wie Sie mit mehrere threads greifen auf die gleiche variable, updates gemacht, indem man Sie ignoriert und überschrieben von anderen, aber was ist, wenn jeder thread ist das schreiben auf den gleichen Wert (nicht verschiedene Werte), um die gleiche variable; kann auch dies zu Problemen führen? Könnte dieser code:
GlobalVar.property = 11;
(vorausgesetzt, die Immobilie wird nie zugewiesen werden, etwas anderes als 11), die zu Problemen führen, wenn mehrere threads ausführen, die es in der gleichen Zeit?
- Welche Sprache verwenden Sie?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem kommt, wenn Sie Lesen, dass Zustand zurück, und tun Sie etwas über es. Schreiben ist eine red herring - es ist wahr, dass, solange diese ein einzelnes Wort ist den meisten Umgebungen garantieren die schreiben werden Atomare, aber das bedeutet nicht, dass ein größeres Stück code, enthält dieses fragment ist thread-sicher. Erstens, vermutlich Ihre globalen Variablen enthalten einen anderen Wert, um mit zu beginnen - andernfalls, wenn Sie wissen, dass es immer das gleiche ist, warum ist es eine variable? Zweite, vermutlich haben Sie schließlich Lesen dieser Wert wieder zurück?
Das Problem ist, dass vermutlich, Sie schreiben dieses bit der gemeinsame Staat aus einem Grund - um zu signalisieren, dass etwas stattgefunden hat? Dies ist, wo es fällt: wenn man keine sperren, Konstrukte, es gibt keine implizite Reihenfolge der Speicherzugriffe auf alle. Es ist schwer zu zeigen zu was ist falsch hier, weil dein Beispiel nicht tatsächlich enthalten die verwenden der Variablen, also hier ist ein trivialish Beispiel in neutralen C-ähnlichen syntax:
Thread wird immer 1 ausgeben, aber es ist vollkommen gültig für thread B zu drucken 0. Die Reihenfolge der Operationen in thread A muss nur erkennbar sein, aus der code-Ausführung in thread A thread B sehen darf, ist jede Kombination von Zustand. Das schreibt die x-und y kann eigentlich nicht passieren, in Ordnung.
Dies kann passieren, auch auf single-Prozessor-Systeme, wo die meisten Menschen nicht erwarten, dass diese Art der Neuordnung - der compiler kann neu ordnen für Sie. Auf SMP-selbst wenn der compiler nicht, ordnen die Dinge, die den Speicher schreibt, können nachbestellt werden zwischen den caches der verschiedenen Prozessoren.
Wenn das nicht scheinen, Ihnen das zu beantworten, sind weitere Details von Ihrem Beispiel in der Frage. Ohne die Verwendung der Variablen ist es unmöglich, endgültig zu sagen, ob eine solche Verwendung sicher ist oder nicht.
Hängt es von der Arbeit eigentlich getan, dass durch die Erklärung. Es können immer noch einige Fälle, wo Etwas Schlimmes passiert - zum Beispiel, wenn eine Klasse in C++ überladen hat den = - operator, und tut etwas, das nicht-triviale innerhalb dieser Anweisung.
Ich habe versehentlich den code geschrieben, der hat so etwas mit POD Typen (eingebaute primitive Typen), und es funktionierte gut -- aber es ist definitiv nicht eine gute Praxis, und ich bin nicht überzeugt, dass es zuverlässig ist.
Warum nicht einfach sperren Sie den Speicher um diese variable, wenn Sie es verwenden? In der Tat, wenn Sie irgendwie "wissen", dies ist die einzige write-Anweisung, die auftreten können, an einem gewissen Punkt in Ihrem code, warum man nicht einfach den Wert 11 direkt, anstatt, Sie zu schreiben, um eine shared-variable?
(edit: ich denke, es ist besser ein name der Konstante statt der Magische Zahl 11 direkt in den code, btw.)
Wenn Sie dies herausfinden, wenn mindestens ein thread erreicht hat, ist diese Aussage, Sie könnte verwenden einen semaphor, der bei 1 beginnt, und wird wieder um eins erniedrigt, indem der erste thread, der es trifft.
Ich würde erwarten, dass das Ergebnis unbestimmt sein. Wie wäre es variiert von compiler, complier, Sprache zu Sprache und von OS zu OS etc. Also Nein, es ist nicht sicher
Warum würden Sie wollen, dies zu tun, obwohl das hinzufügen in eine Zeile erhalten Sie eine mutex-Sperre ist nur ein oder zwei Zeilen code (in den meisten Sprachen), und entfernen jede Möglichkeit der problem. Wenn dieses ist, werden zwei teure, dann müssen Sie eine Alternative finden, bei der Lösung des Problems
Dies ist im Allgemeinen nicht als eine sichere Sache zu tun, es sei denn, Ihr system für Atomare operation (Operationen, die garantiert sind, ausgeführt werden, in einem einzigen Zyklus).
Der Grund ist, dass, während die "C" - Anweisung sieht einfach aus, oft gibt es eine Reihe von zugrunde liegenden Montage stattfindet.
Je nach Betriebssystem, gibt es ein paar Dinge, die Sie tun könnten:
Hier ist mein nehmen auf die Frage.
Haben Sie zwei oder mehr threads laufen, das schreiben auf eine variable...wie ein Statussymbol oder etwas, wo Sie wollen nur wissen, ob einer oder mehrere von Ihnen wahr war. Dann in einem anderen Teil des Codes (nach den threads komplett) möchten Sie überprüfen und sehen, wenn Sie mindestens auf den thread setzen, status... zum Beispiel
Ich glaube, der obige code würde in Ordnung sein, vorausgesetzt, Sie sind gut, nicht zu wissen, welcher thread setzt den status auf true, und Sie können warten, für alle multi-Thread-Sachen zu beenden, bevor Sie Lesen, dass die fahne. Ich könnte falsch sein, aber.
Vorausgesetzt, die Immobilie wird nie zugewiesen werden, etwas anderes als 11, dann sehe ich keinen Grund für die Zuweisung in den ersten Platz. Es muss nur eine Konstante dann.
Zuweisung macht nur Sinn, wenn Sie beabsichtigen, ändern Sie den Wert , es sei denn den Akt der Zuweisung selbst hat andere Nebenwirkungen, wie flüchtige schreibt über Speicher-Sichtbarkeit Nebenwirkungen in Java. Und wenn Sie ändern Ihren Zustand von mehreren threads gemeinsam genutzt, dann müssen Sie synchronisieren oder anderweitig "behandeln" das problem der Gleichzeitigkeit.
Wenn Sie einen Wert zuweisen, ohne korrekte Synchronisation, zu einem Zustand von mehreren threads gemeinsam genutzt, dann gibt es keine Garantien für, wenn die anderen threads werden sehen, dass ändern. Und keine Sichtbarkeit garantiert, bedeutet, dass es es möglich, dass die anderen threads werden nie sehen die assignt.
Compiler, die JITs, CPU-caches. Sie sind alle versuchen, Ihren code so schnell wie möglich laufen, und wenn Sie nicht eine explizite Anforderungen für Speicher-Sichtbarkeit, dann werden Sie nehmen Vorteil, dass. Wenn nicht auf Ihrem Rechner, dann jemand elses.
Wenn der Vorgang atomar ist, Sie sollte auskommen just fine. Aber ich würde das nicht tun in der Praxis. Es ist besser, einfach zu erwerben, eine Sperre auf das Objekt und schreiben Sie den Wert.