Eine weitere Synchronisationsfrage ... Ich hoffe euch wird es nicht genervt;)Synchronisation für mehrere Leser, Einzelschreiber?
Angenommen, das folgende Szenario: eine zentrale Datenstruktur (sehr groß, also möchte ich es nicht wirklich unveränderlich machen und es kopieren Ich möchte sogar nicht mehrere Kopien im Speicher behalten), mehrere Leser-Threads, die schreibgeschützt auf diese Datenstruktur zugreifen, und einen Writer-Thread, der die Datenstruktur im Hintergrund auf dem neuesten Stand hält.
Ich synchronisiere derzeit alle Zugriffe auf die Datenstruktur, was gut funktioniert (keine Synchronisationseffekte, keine Deadlocks). Was ich an diesem Ansatz nicht mag, ist, dass ich meistens eine Menge Leser-Threads aktiv habe und der Writer-Thread nur ab und zu aktiv ist. Jetzt ist es völlig unnötig, dass die Leser-Threads darauf warten, dass andere Leser-Threads beendet werden. Sie könnten leicht parallel auf die Datenstruktur zugreifen, solange der Autorenthread gerade nicht schreibt.
Gibt es einen schönen und eleganten Weg, um diese Art von Szenario zu lösen?
EDIT: Vielen Dank für die Antworten und Links! Lassen Sie mich nur eine weitere kurze und verwandte Frage hinzufügen: Wenn der in den kritischen Abschnitten des Lesers ausgeführte Code nur eine sehr kurze Zeit benötigt (wie nur eine Hashtabellen-Suche), ist es sogar sinnvoll, eine der beschriebenen Techniken zu implementieren oder die Serialisierung Wirkung der Schlösser in diesem Fall nicht so schlecht? Skalierbarkeit und Leistung sind sehr wichtig. Was denken Sie?
BEARBEITEN 2: Ich habe gerade in eine Implementierung eines einzelnen Writer/multiple Leser - Sperre untersucht und diese Implementierung verwendet einen Monitor, um einige Code in der WaitToRead-Methode zu synchronisieren. Führt das nicht zu dem gleichen Serialisierungseffekt, den ich in erster Linie vermeiden wollte? (Immer vorausgesetzt, dass der zu synchronisierende Code kurz und schnell ist)
Beachten Sie, dass diese Klasse in einigen Delphi-Versionen fatal beschädigt ist. Es ist seit Delphi 2005 behoben, vielleicht früher. –