[fpc-pascal] Strange issue with threads

Luca Olivetti luca at ventoso.org
Fri May 22 17:03:23 CEST 2009


While I was testing an unrelated issue, I discovered this: under
windows, with fpc 2.2.4, I try to start 10000 thread (I know it's absurd
but it's just a test) and have all of them linger around for 10 seconds.
The thread actually started are 121. The problem is that no exception is
raised, so how can I be sure that a thread is really started in a more
normal scenario? Is there a hard limit on the number of threads under
windows? If so, why no exception when I try to create more?
If I run the same program under Linux, an "EThread: failed to create new
thread" exception is raised after around 300 threads.

This is the test program

---------------8<-----------8<-------------8<------------------
program project1;

{$mode objfpc}{$H+}

uses
   {$IFDEF UNIX}{$IFDEF UseCThreads}
   cthreads,
   {$ENDIF}{$ENDIF}
   Classes, Sysutils, SyncObjs
   { you can add units after this };

var
   Started:integer;
   AccessStarted:TCriticalSection;

type

   { TMyThread }

   TMyThread = class(TThread)
     procedure Execute;override;
   end;

procedure TMyThread.Execute;
begin
   AccessStarted.Acquire;
   Started:=Started+1;
   AccessStarted.Release;
   Sleep(10000);
end;

var i:integer;


{$IFDEF WINDOWS}{$R project1.rc}{$ENDIF}

begin
   AccessStarted:=TCriticalSection.Create;
   Started:=0;
   for i:=1 to 10000 do
   begin
     TMyThread.Create(false);
     writeln(i);
   end;
   while true do
   begin
     AccessStarted.Acquire;
     writeln('Threads started:',started);
     AccessStarted.Release;
     Sleep(1000);
   end;
end.

---------------8<-----------8<-------------8<------------------

If I remove the sleep(10000) (the writeln(i) should also be removed), 
the number of threads started is a random
number, normally less than the 10000 expected, hence my deduction that
there's a hard limit on the number of threads (i.e. less threads hanging
around so more can be actually started).

Bye
-- 
Luca






More information about the fpc-pascal mailing list