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