Failed to create new Thread

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
paradox
Beiträge: 34
Registriert: Fr 15. Sep 2006, 14:33

Failed to create new Thread

Beitrag von paradox »

Hi,

ich habe eine recht simple Serveranwendung unter Linux geschrieben.
Die Anfragen mit Hilfe von synapse entgegen nimmt, soweit funktioniert auch alles. Doch nach ca. 100-120 Anfragen mit mehren Threads sagt mir die Anwendung
„Failed to create new Thread“ wenn ich danach raiseLastOSError aufrufe sagt der mir
“Transport endpoint is not connected”.

Hat jemand eine Idee wie ich vielleicht etwas mehr Informationen bekommen kann.

[edit]
Ich nutze Freepascal Compilier 2.1.4 und Lazarus 0.9.22.

Ich hab auch noch einmal synapse geladen und die HttpServer Demo genommen.
Auch hier kommt nach ca. 100-120 aufrufen (IE und einfach mal f5 gedrueckt halten) die Selbe Meldung.
Kann das jemand nach vollziehen? Habe ich wieder mal eine config vergessen zu setzen ?
[/edit]

Gruss
Paradox

paradox
Beiträge: 34
Registriert: Fr 15. Sep 2006, 14:33

Beitrag von paradox »

Nach langem rum probieren habe ich den Quelltext auf stolze 50 Zeilen gebracht.
Unter Linux mit 2.6 Kernel und mit Fpc 2.0.4 Kompiliert läuft es mit 2.1.4 kommt die Fehlermeldung.

Könnte mir das jemand bestätigen? Damit ich vielleicht einen Eintrag im Bug-tracking machen kann.

Danke schon mal.


Code: Alles auswählen

program code;
 
{$mode objfpc}{$H+}
 
uses cthreads, Classes, SysUtils;
 
type
  TTestThread = Class(TThread)
  protected
    procedure Execute; override;
  public
    constructor Create;
  end;
 
  TMainThread = Class(TThread)
  protected
    procedure Execute; override;
  end;
 
procedure TMainThread.Execute;
Var
  I : Integer;
begin
  try
    for I := 0 to 10000 do  //after 381 Threads
      TTestThread.Create;   //rais Exception with "Failed to create new Thread"
  except
    on E: Exception do WriteLn(E.Message);
  end;
  Sleep(1000);
end;
 
constructor TTestThread.Create;
begin
  FreeOnTerminate := True;
  inherited Create(False);
end;
 
procedure TTestThread.Execute;
begin //Do nothing
end;
 
 
var
  aMainThread : TMainThread;
begin
  aMainThread := TMainThread.Create(false);
  aMainThread.WaitFor;
  aMainThread.Free;
end.
Dateianhänge
code.lpr
(887 Bytes) 72-mal heruntergeladen

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Ich weiss nicht wo genau dein Problem ist aber du kannst nicht "unendlich" viele konkurrente Threads erzeugen. Soweit ich micht erinnere liegt das sinnvolle Maximum im christlichen Bereich von unter 20 Threads. Das gibt afair auch Microsoft so an. Bei mehr Threads sinkt die Performance durch das switching eher, und irgendwann ist auch einfach Schluss. 10000 sind sicher nicht drin, 500-1000 gehen grad noch so wobei die Performance leidet.
Ausweg: Thread Pool.

paradox
Beiträge: 34
Registriert: Fr 15. Sep 2006, 14:33

Beitrag von paradox »

Hi Theo,

ja du hast recht man sollte nicht alt so viele Threads erstellen. Aber der TMainThread erstellt TTestThreads die FreeOnTerminate haben und nichts im execute, somit sollten sie sich sofort wieder Freigeben.
Was sie aber allem Anschein nach nicht tun.

Gruss
Paradox

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »


paradox
Beiträge: 34
Registriert: Fr 15. Sep 2006, 14:33

Beitrag von paradox »

Hi Theo,

ja genau das ist mein Problem. Ich danke dir.

Antworten