Hi,

I first asked this question in the Lazarus mailing list, but was told it
may be more appropriate here. When you create a new project in Lazarus,
the default uses clause in the *.lpr file looks as follows:

---------------
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes;
---------------

Question 1:
  Is there an alternative implementation of multi-threading support for
Unix-type systems -- other than the cthreads unit?


Question 2:
  If not, then why do we have the extra "IFDEF UseCThreads" define in
the uses clause?

Why can't we just have the following...? By default Windows programs and
OS/2 programmes have multi-threading support compiled in, why don't we
do the same for Unix-type systems? I often get the "program not compiled
with multi-threading support" error and have to constantly define the
UseCThreads option.

---------------
uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  Classes;
---------------


Mattias mentioned that when cthreads unit is included, all string access
needs critial sections which will slow down string access for any
unix-type OS.

Now because under Windows, threading support is on by default, does that
mean the same program will run faster under Linux than under Windows?
Why is threading enabled by default under Windows and not under other
platforms?


I asked Mattias for a sample project that will show the slowdown, so I
can see by what factor it is slower. He supplied the following program.

---------------------
program bench1;

{$mode objfpc}{$H+}

uses
  //cthreads,
  //cmem,
  classes, sysutils;

var
  s1: String;
  s2: String;
  i: Integer;
  s: String;
  t: TThread;
begin
  //t:=TThread.Create(true);
  s1:=IntToStr(Paramcount+12345);
  s2:=IntToStr(Paramcount+23456);
  for i:=1 to 500000000 do begin
    s:=s1;
    s:=s2;
  end;
end.
---------------------

Mattias test results are as follows:

Under his Linux machine the above program takes about 7.5 seconds.
Uncomment the cthreads unit: 7.5 seconds

Under OS X the above program takes on his mac book about 15 seconds.
Uncomment the cthreads unit: 21 seconds


On my Linux system I have the following results:
// without cthreads in uses clause
$ time ./bench1

real    0m9.971s
user    0m9.969s
sys     0m0.004s

// with cthreads in uses clause - but no TThread usage.
$ time ./bench1

real    0m9.973s
user    0m9.973s
sys     0m0.000s


So on my system having the cthreads unit included by default will make
no difference at all. This is the point I'm trying to make.

Can anybody explain why we have to explicitly enable threading support
under unix-type OSes, but comes standard with Windows?

Regards,
  - Graeme -

-- 
fpGUI Toolkit - a cross-platform GUI toolkit using Free Pascal
http://opensoft.homeip.net/fpgui/

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to