Hintergrund:
Also ich schreibe einen SLB der Folgendes leistens wird:
Der SLB vermittelt zwischen einem Webserver (der nur
HTML Rendert) und mehreren Instanzen eines Applikationsserver die auf dem selben Rechner laufen. Es wird ein Socket vermittelt. d.h. jede Instanz läuft mit einem anderen Port und später ist das ganze auch auf mehrere Rechner skalierbar.
Dieser SLB verwaltet also eine liste mit Statistischen Daten über Applikationsserver, wie z.B. deren momentan gequeute Jobs oder einen "Lastwert" .
Problem:
Wenn ich auf diese Liste zugreife und z.B. den Server mit der geringsten last gefunden habe,
kann es sein das ein anderer Thread im SLB diesen auch findet und ihn auslastet bevor ich diese Liste aktualisieren kann.
Ist das richtig ?
Muss deswegen alles in einer Criticalsection passieren?
Delphi-Quellcode:
job:=DecodeRequest(sRequest);
CS.Enter;
ServerDaten := getServer(job); //ServerDaten ist ein Element einer global gehaltenen Liste.
ServerDaten.Jobs.add(job.ID,job.timeout);
ServerDaten.lastwert := getLW(ServerDaten.Jobs);
sRespons := EncodeResponse(ServerDaten.Socket);
CS.Leave;
Bremst das nicht definitiv den Server aus , wenn quasi 90% des Codes in einer Crtitcalsection ausgeführt werden?
Einen anderen Weg gibt es wohl nicht, oder?