Welche Lehren haben Sie aus einem Projekt gezogen, das aufgrund von schlechtem Multithreading fast / tatsächlich gescheitert ist?
Manchmal schreibt das Framework ein bestimmtes Threading-Modell vor, das es schwieriger macht, Dinge um eine Größenordnung richtig zu machen.
Ich habe mich noch nicht von dem letzten Fehler erholt und bin der Meinung, dass es für mich besser ist, an nichts zu arbeiten, was mit Multithreading in diesem Rahmen zu tun hat.
Ich fand, dass ich gut in Multithreading-Problemen war, die eine einfache Verzweigung / Verbindung haben und bei denen Daten nur in eine Richtung übertragen werden (während Signale in kreisförmiger Richtung übertragen werden können).
Ich kann keine GUI verarbeiten, in der einige Arbeiten nur an einem streng serialisierten Thread (dem "Hauptthread") und andere Arbeiten nur an einem anderen Thread als dem Hauptthread (den "Arbeitsthreads") ausgeführt werden können Dabei müssen Daten und Nachrichten zwischen N Komponenten in alle Richtungen übertragen werden (ein vollständig verbundener Graph).
Zu der Zeit, als ich dieses Projekt für ein anderes verließ, gab es überall Deadlock-Probleme. Ich habe gehört, dass es 2-3 Monate später mehreren anderen Entwicklern gelungen ist, alle Deadlock-Probleme zu beheben, bis sie an Kunden versendet werden können. Ich habe es nie geschafft herauszufinden, dass mir das fehlende Wissen fehlt.
Etwas über das Projekt: Die Anzahl der Nachrichten-IDs (ganzzahlige Werte, die die Bedeutung eines Ereignisses beschreiben, das unabhängig vom Threading in die Nachrichtenwarteschlange eines anderen Objekts gesendet werden kann) beträgt mehrere Tausend. Eindeutige Zeichenfolgen (Benutzernachrichten) sind ebenfalls ungefähr tausend.
Hinzugefügt
Die beste Analogie, die ich von einem anderen Team erhalten habe (unabhängig von meinen früheren oder gegenwärtigen Projekten), war, "die Daten in eine Datenbank zu stellen". ("Datenbank" bezieht sich auf Zentralisierung und atomare Aktualisierungen.) In einer GUI, die in mehrere Ansichten fragmentiert ist, die alle auf demselben "Hauptthread" ausgeführt werden, und das gesamte Nicht-GUI-Schwergewicht in einzelnen Arbeitsthreads ausgeführt wird, sollten die Daten der Anwendung verwendet werden in einer einzigen Plase gespeichert werden, die sich wie eine Datenbank verhält, und die "Datenbank" alle "atomaren Aktualisierungen" mit nicht trivialen Datenabhängigkeiten verarbeiten lassen. Alle anderen Teile der GUI behandeln nur das Zeichnen von Bildschirmen und sonst nichts. Die UI-Teile könnten Dinge zwischenspeichern und der Benutzer wird nicht bemerken, ob sie im Bruchteil einer Sekunde veraltet sind, wenn sie richtig entworfen wurden. Diese "Datenbank" wird auch als "Dokument" bezeichnet. in der Document-View-Architektur. Leider - nein, meine App speichert tatsächlich alle Daten in den Ansichten. Ich weiß nicht, warum es so war.
Mitwirkende:
(Mitwirkende müssen keine realen / persönlichen Beispiele verwenden. Lehren aus anekdotischen Beispielen sind ebenfalls willkommen, wenn sie von Ihnen als glaubwürdig beurteilt werden.)