Ist es sicher, die Lese-Schreib-Race-Bedingung eines reibungslosen Wechsel Gleitkommawert zu ignorieren?

StackOverflow https://stackoverflow.com/questions/2340027

  •  22-09-2019
  •  | 
  •  

Frage

Während ich versuche, für die Ausführung der Animation Update-Funktion und Physik-Simulation eines Game-Engine in einem separaten Thread zu setzen, wird mir klar, das Potenzial Race-Bedingung einiger Gleitkommawerte (etwa Position eines Objekts) zwischen dem Writer-Thread ( Animation, Physik) und der Leser-Thread (Renderer), wenn beide Threads die Werte gleichzeitig zugreifen werden.

Meine Frage ist, da auch eine Gleitkomma-Zuordnung nicht atomar ist, wird so eine Lese-Schreib-Race-Bedingung eine wired / plötzliche Änderung der ursprünglichen glatt Werte ändern führen kann, wie durch den Leser gesehen?

Darüber hinaus ist in meiner Situation kann ich Toleranz eine kleine Menge Fehler, da ein solcher Fehler akkumulieren nicht über den nächsten Renderingrahmen.

War es hilfreich?

Lösung

Theoretisch Sie einen massiven Fehlergrad bekommen könnte, wenn es einen Kontextwechsel war zwischen den Exponenten der Aktualisierung und der Mantisse zu aktualisieren, aber ich bezweifle die meisten Plattformen oder Architekturen heute im Einsatz ermöglichen so etwas passieren.

Andere Tipps

Für mein Verständnis, können Sie die Race-Bedingung, so lange ignorieren, da Sie nur auf Thread haben die veriable zu einem Zeitpunkt, zu schreiben und Sie kümmern sich nicht, wenn Sie Ihre Lesefaden (s) nicht die neueste Version verwendet wird.

Von meinem Verständnis, den Schwimmer zu schreiben soll, um Ihren Code atomar sein, obwohl diese plattformabhängig sein könnte, nehme ich an.

Abschnitt 12.5 von ECMA-334 (die Sprache C # specifcation ) heißt es:

  

liest und schreibt die folgenden Daten   bool, char: Typen sind atomar sein   Byte, sbyte, kurz, ushort, uint, int,   Schwimmer und Referenztypen.

Zu diesem Zweck sollten Sie keine Korruption sehen aufgrund liest und schreibt von einem Schwimmer (vorausgesetzt, Sie bedeuten nicht doppelt hier, das ist nicht garantiert eine atomare Schreib sein).

Was jedoch angemerkt werden sollte, ist, dass, während das Schreiben der Werte garantiert atomar sein, die Reihenfolge der liest / schreibt ist nicht garantiert, wenn Sie etwas Bestimmtes verwenden, wie ein Anruf Monitor.Enter .

Monitor.Enter ist ein wenig schwer für diese aber, so würde ich empfehlen, mit der Schlüsselwort volatile bei der Deklaration der variablen. Unter der Annahme, den Lese- / Schreib dieser Variablen ist die einzige Sache, die Bedürfnisse auftreten, es wird sichergestellt, dass die Lese- / Schreibvorgänge, um fertig sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top