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
Failed to create new Thread
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.
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) 91-mal heruntergeladen
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.
Ausweg: Thread Pool.
Hat's damit zu tun:
http://www.freepascal.org/mantis/view.php?id=9016" onclick="window.open(this.href);return false;
http://www.freepascal.org/mantis/view.php?id=9016" onclick="window.open(this.href);return false;