- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello all,
I have updated Threadpool (and threadpool with priority) to version
1.2 - a stable version - i had some - difficult - problems with the
FPC memory manager, so, i have used some tricks to avoid
completly those problems..
Author: Amine Moulay Ramdane
Language: FPC Pascal v2.2.0+ / Delphi 5+: http://www.freepascal.org/
Operating Systems: Win , Linux and Mac (x86).
Description:
Lock-free threadpool.
The following have been added:
-- Lockfree ParallelQueue for less contention and more efficiency
or it can use lockfree_mpmc - flqueue that i have modified, enhanced
and improved... -
- It does use many queues and work-stealing - for more efficiency -
- Enters in a wait state when there no job in the queue,
hence, it's very efficient
- You can now call any method with the excute() method, like this
excute(your method, parameter);
In Object Pascal it looks like this:
TP.execute(myobj.myproc1,pointer(obj));
- look inside the zipfile i have included two demos:
test.pas, and ptestpool.pas - a Parallel program of Matrix
multiply by a vector that use SSE+ -
Look into defines.inc there is many options:
CPU32: for 32 bits architecture
MUTIPLE_PRODUCER: mutiple producer (threads)
ParallelQueue: does use ParallelQueue - very efficient -
Lockfree_MPMC: does use Lockfree_MPMC
ParallelQueueh: does use ParallelQueueh - ParallelQueueh is for educational purpose -
SINGLE_PRODUCER: for a single producer (thread)
Required FPC switches: -Sd -dFPC -dWin32 -dFreePascal
-Sd for delphi mode....
Required Delphi switches: -DMSWINDOWS -DDelphi -$H+
Please look at the examples test.pas,testpool.pas and test_thread.pas...
Note: testpool.pas does require Delphi 5+, test.pas and test_thread.pas
works with both FreePascal and Delphi
You can download the new and stable version from:
http://pages.videotron.com/aminer/
My Threadpool is VERY easy to use, and here is an example:
-------------------------------------------------------------------------------------------
program test;
uses
{$IFDEF Delphi}
cmem,
{$ENDIF}
ThreadPool,sysutils,windows,classes,syncobjs;
type
TMyThread = class (TThreadPoolThread)
//procedure ProcessRequest(obj: Pointer); override;
procedure MyProc1(obj: Pointer);
procedure MyProc2(obj: Pointer);
end;
var hndlArr : Array[0..19] of THandle;
AId:DWORD;
event1,event2:TSimpleEvent;
n:int64;
j:integer;
myobj:TMyThread;
TP: TThreadPool;
obj:pointer;
cs:TCriticalSection;
number:integer;
procedure TMyThread.MyProc1(obj: Pointer);
begin
cs.enter;
inc(number);
if number=4000000 then event2.setevent;
writeln(number);
//writeln('This is MyProc1 with parameter: ',integer(obj));
cs.leave;
end;
procedure TMyThread.MyProc2(obj: Pointer);
begin
cs.enter;
inc(number);
if number=4000000 then event2.setevent;
writeln(number);
//writeln('This is MyProc2 with parameter: ',integer(obj));
cs.leave;
end;
function StartFunc1(InVal:pointer):DWORD;
var temp:tobject;
i:integer;
obj:pointer;
func:TMyProc;
begin
event1.waitfor(INFINITE);
for i:=0 to 999999
do
begin
obj:=pointer(i);
TP.execute(myobj.myproc1,obj);
end;
end;
function StartFunc2(InVal:pointer):DWORD;
var temp:tobject;
i:integer;
obj:pointer;
func:TMyProc;
begin
event1.waitfor(INFINITE);
for i:=0 to 999999
do
begin
obj:=pointer(i);
TP.execute(myobj.myproc1,obj);
end;
end;
function StartFunc3(InVal:pointer):DWORD;
var temp:tobject;
i:integer;
obj:pointer;
func:TMyProc;
begin
event1.waitfor(INFINITE);
for i:=0 to 999999
do
begin
obj:=pointer(i);
TP.execute(myobj.myproc2,obj);
end;
end;
function StartFunc4(InVal:pointer):DWORD;
var temp:tobject;
i:integer;
obj:pointer;
func:TMyproc;
begin
event1.waitfor(INFINITE);
for i:=0 to 999999
do
begin
obj:=pointer(i);
TP.execute(myobj.myproc2,obj);
end;
end;
begin
number:=0;
cs:=TCriticalSection.create;
myobj:=TMyThread.create;
TP := TThreadPool.Create(4, 10, TMyThread);
// 4 workers threads and 2^10 items for each queue.
event1:=TSimpleEvent.create;
event2:=TSimpleEvent.create;
hndlArr[0]:=BeginThread(nil,0,@StartFunc1,pointer(1),0,AId);
hndlArr[1]:=BeginThread(nil,0,@StartFunc2,pointer(1),0,AId);
hndlArr[2]:=BeginThread(nil,0,@StartFunc3,pointer(1),0,AId);
hndlArr[3]:=BeginThread(nil,0,@StartFunc4,pointer(1),0,AId);
event1.setevent;
WaitForMultipleObjects(2, @hndlArr, True, INFINITE);
event2.waitfor(INFINITE);
writeln('Number is: ',number);
end.
----------------------------------------------------------------------------------------
Sincerely,
Amine Moulay Ramdane.
Link Copied
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page