Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Multithreading zugriff auf eine THashedStringlist in einem SLB (https://www.delphipraxis.net/170661-multithreading-zugriff-auf-eine-thashedstringlist-einem-slb.html)

QuickAndDirty 27. Sep 2012 16:14

Multithreading zugriff auf eine THashedStringlist in einem SLB
 
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?

Zacherl 27. Sep 2012 19:09

AW: Multithreading zugriff auf eine THashedStringlist in einem SLB
 
Generell solltest du den Zugriff auf deine Liste definitiv durch CriticalSections absichern. Du müsstest halt schauen, wie du deinen Server designst, sodass wirklich nur ein Minimum an Code in der CriticalSection liegt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz