<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Threadpool 1.2 (stable version ...) ...   in Intel® Moderncode for Parallel Architectures</title>
    <link>https://community.intel.com/t5/Intel-Moderncode-for-Parallel/Threadpool-1-2-stable-version/m-p/860754#M2316</link>
    <description>&lt;SPAN style="font-size: x-small;"&gt;
&lt;P&gt;&lt;BR /&gt;Hello all,&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;I have updated Threadpool (and threadpool with priority) to version&lt;/P&gt;
&lt;P&gt;1.2 - a stable version - i had some - difficult - problems with the&lt;/P&gt;
&lt;P&gt;FPC memory manager, so, i have used some tricks to avoid&lt;/P&gt;
&lt;P&gt;completly those problems..&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Author: Amine Moulay Ramdane&lt;/P&gt;
&lt;P&gt;Language: FPC Pascal v2.2.0+ / Delphi 5+: &lt;A href="http://www.freepascal.org/" target="_blank"&gt;http://www.freepascal.org/&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Operating Systems: Win , Linux and Mac (x86).&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Description:&lt;/P&gt;
&lt;P&gt;Lock-free threadpool.&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;The following have been added:&lt;/P&gt;
&lt;P&gt;-- Lockfree ParallelQueue for less contention and more efficiency&lt;/P&gt;
&lt;P&gt;or it can use lockfree_mpmc - flqueue that i have modified, enhanced&lt;/P&gt;
&lt;P&gt;and improved... -&lt;/P&gt;
&lt;P&gt;- It does use many queues and work-stealing - for more efficiency -&lt;/P&gt;
&lt;P&gt;- Enters in a wait state when there no job in the queue,&lt;/P&gt;
&lt;P&gt;hence, it's very efficient&lt;/P&gt;
&lt;P&gt;- You can now call any method with the excute() method, like this&lt;/P&gt;
&lt;P&gt;excute(your method, parameter);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;In Object Pascal it looks like this:&lt;/P&gt;
&lt;P&gt;TP.execute(myobj.myproc1,pointer(obj));&lt;/P&gt;
&lt;P&gt;- look inside the zipfile i have included two demos:&lt;/P&gt;
&lt;P&gt;test.pas, and ptestpool.pas - a Parallel program of Matrix&lt;/P&gt;
&lt;P&gt;multiply by a vector that use SSE+ -&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Look into defines.inc there is many options:&lt;/P&gt;
&lt;P&gt;CPU32: for 32 bits architecture&lt;/P&gt;
&lt;P&gt;MUTIPLE_PRODUCER: mutiple producer (threads)&lt;/P&gt;
&lt;P&gt;ParallelQueue: does use ParallelQueue - very efficient -&lt;/P&gt;
&lt;P&gt;Lockfree_MPMC: does use Lockfree_MPMC&lt;/P&gt;
&lt;P&gt;ParallelQueueh: does use ParallelQueueh - ParallelQueueh is for educational purpose -&lt;/P&gt;
&lt;P&gt;SINGLE_PRODUCER: for a single producer (thread)&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Required FPC switches: -Sd -dFPC -dWin32 -dFreePascal&lt;/P&gt;
&lt;P&gt;-Sd for delphi mode....&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Required Delphi switches: -DMSWINDOWS -DDelphi -$H+&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Please look at the examples test.pas,testpool.pas and test_thread.pas...&lt;/P&gt;
&lt;P&gt;Note: testpool.pas does require Delphi 5+, test.pas and test_thread.pas&lt;/P&gt;
&lt;P&gt;works with both FreePascal and Delphi&lt;/P&gt;
&lt;P&gt;You can download the new and stable version from:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://pages.videotron.com/aminer/" target="_blank"&gt;http://pages.videotron.com/aminer/&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;My Threadpool is VERY easy to use, and here is an example:&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;-------------------------------------------------------------------------------------------&lt;/P&gt;
&lt;P&gt;program test;&lt;/P&gt;
&lt;P&gt;uses&lt;/P&gt;
&lt;P&gt;{$IFDEF Delphi}&lt;/P&gt;
&lt;P&gt;cmem,&lt;/P&gt;
&lt;P&gt;{$ENDIF}&lt;/P&gt;
&lt;P&gt;ThreadPool,sysutils,windows,classes,syncobjs;&lt;/P&gt;
&lt;P&gt;type&lt;/P&gt;
&lt;P&gt;TMyThread = class (TThreadPoolThread)&lt;/P&gt;
&lt;P&gt;//procedure ProcessRequest(obj: Pointer); override;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;procedure MyProc1(obj: Pointer);&lt;/P&gt;
&lt;P&gt;procedure MyProc2(obj: Pointer);&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;var hndlArr : Array[0..19] of THandle;&lt;/P&gt;
&lt;P&gt;AId:DWORD;&lt;/P&gt;
&lt;P&gt;event1,event2:TSimpleEvent;&lt;/P&gt;
&lt;P&gt;n:int64;&lt;/P&gt;
&lt;P&gt;j:integer;&lt;/P&gt;
&lt;P&gt;myobj:TMyThread;&lt;/P&gt;
&lt;P&gt;TP: TThreadPool;&lt;/P&gt;
&lt;P&gt;obj:pointer;&lt;/P&gt;
&lt;P&gt;cs:TCriticalSection;&lt;/P&gt;
&lt;P&gt;number:integer;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;procedure TMyThread.MyProc1(obj: Pointer);&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;cs.enter;&lt;/P&gt;
&lt;P&gt;inc(number);&lt;/P&gt;
&lt;P&gt;if number=4000000 then event2.setevent;&lt;/P&gt;
&lt;P&gt;writeln(number);&lt;/P&gt;
&lt;P&gt;//writeln('This is MyProc1 with parameter: ',integer(obj));&lt;/P&gt;
&lt;P&gt;cs.leave;&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;procedure TMyThread.MyProc2(obj: Pointer);&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;cs.enter;&lt;/P&gt;
&lt;P&gt;inc(number);&lt;/P&gt;
&lt;P&gt;if number=4000000 then event2.setevent;&lt;/P&gt;
&lt;P&gt;writeln(number);&lt;/P&gt;
&lt;P&gt;//writeln('This is MyProc2 with parameter: ',integer(obj));&lt;/P&gt;
&lt;P&gt;cs.leave;&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;function StartFunc1(InVal:pointer):DWORD;&lt;/P&gt;
&lt;P&gt;var temp:tobject;&lt;/P&gt;
&lt;P&gt;i:integer;&lt;/P&gt;
&lt;P&gt;obj:pointer;&lt;/P&gt;
&lt;P&gt;func:TMyProc;&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;event1.waitfor(INFINITE);&lt;/P&gt;
&lt;P&gt;for i:=0 to 999999&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;do&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;obj:=pointer(i);&lt;/P&gt;
&lt;P&gt;TP.execute(myobj.myproc1,obj);&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;function StartFunc2(InVal:pointer):DWORD;&lt;/P&gt;
&lt;P&gt;var temp:tobject;&lt;/P&gt;
&lt;P&gt;i:integer;&lt;/P&gt;
&lt;P&gt;obj:pointer;&lt;/P&gt;
&lt;P&gt;func:TMyProc;&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;event1.waitfor(INFINITE);&lt;/P&gt;
&lt;P&gt;for i:=0 to 999999&lt;/P&gt;
&lt;P&gt;do&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;obj:=pointer(i);&lt;/P&gt;
&lt;P&gt;TP.execute(myobj.myproc1,obj);&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;function StartFunc3(InVal:pointer):DWORD;&lt;/P&gt;
&lt;P&gt;var temp:tobject;&lt;/P&gt;
&lt;P&gt;i:integer;&lt;/P&gt;
&lt;P&gt;obj:pointer;&lt;/P&gt;
&lt;P&gt;func:TMyProc;&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;event1.waitfor(INFINITE);&lt;/P&gt;
&lt;P&gt;for i:=0 to 999999&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;do&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;obj:=pointer(i);&lt;/P&gt;
&lt;P&gt;TP.execute(myobj.myproc2,obj);&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;function StartFunc4(InVal:pointer):DWORD;&lt;/P&gt;
&lt;P&gt;var temp:tobject;&lt;/P&gt;
&lt;P&gt;i:integer;&lt;/P&gt;
&lt;P&gt;obj:pointer;&lt;/P&gt;
&lt;P&gt;func:TMyproc;&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;event1.waitfor(INFINITE);&lt;/P&gt;
&lt;P&gt;for i:=0 to 999999&lt;/P&gt;
&lt;P&gt;do&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;obj:=pointer(i);&lt;/P&gt;
&lt;P&gt;TP.execute(myobj.myproc2,obj);&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;number:=0;&lt;/P&gt;
&lt;P&gt;cs:=TCriticalSection.create;&lt;/P&gt;
&lt;P&gt;myobj:=TMyThread.create;&lt;/P&gt;
&lt;P&gt;TP := TThreadPool.Create(4, 10, TMyThread);&lt;/P&gt;
&lt;P&gt;// 4 workers threads and 2^10 items for each queue.&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;event1:=TSimpleEvent.create;&lt;/P&gt;
&lt;P&gt;event2:=TSimpleEvent.create;&lt;/P&gt;
&lt;P&gt;hndlArr[0]:=BeginThread(nil,0,@StartFunc1,pointer(1),0,AId);&lt;/P&gt;
&lt;P&gt;hndlArr[1]:=BeginThread(nil,0,@StartFunc2,pointer(1),0,AId);&lt;/P&gt;
&lt;P&gt;hndlArr[2]:=BeginThread(nil,0,@StartFunc3,pointer(1),0,AId);&lt;/P&gt;
&lt;P&gt;hndlArr[3]:=BeginThread(nil,0,@StartFunc4,pointer(1),0,AId);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;event1.setevent;&lt;/P&gt;
&lt;P&gt;WaitForMultipleObjects(2, @hndlArr, True, INFINITE);&lt;/P&gt;
&lt;P&gt;event2.waitfor(INFINITE);&lt;/P&gt;
&lt;P&gt;writeln('Number is: ',number);&lt;/P&gt;
&lt;P&gt;end.&lt;/P&gt;
&lt;P&gt;----------------------------------------------------------------------------------------&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Sincerely,&lt;/P&gt;
&lt;P&gt;Amine Moulay Ramdane.&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;/SPAN&gt;</description>
    <pubDate>Fri, 26 Mar 2010 07:33:47 GMT</pubDate>
    <dc:creator>aminer10</dc:creator>
    <dc:date>2010-03-26T07:33:47Z</dc:date>
    <item>
      <title>Threadpool 1.2 (stable version ...) ...</title>
      <link>https://community.intel.com/t5/Intel-Moderncode-for-Parallel/Threadpool-1-2-stable-version/m-p/860754#M2316</link>
      <description>&lt;SPAN style="font-size: x-small;"&gt;
&lt;P&gt;&lt;BR /&gt;Hello all,&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;I have updated Threadpool (and threadpool with priority) to version&lt;/P&gt;
&lt;P&gt;1.2 - a stable version - i had some - difficult - problems with the&lt;/P&gt;
&lt;P&gt;FPC memory manager, so, i have used some tricks to avoid&lt;/P&gt;
&lt;P&gt;completly those problems..&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Author: Amine Moulay Ramdane&lt;/P&gt;
&lt;P&gt;Language: FPC Pascal v2.2.0+ / Delphi 5+: &lt;A href="http://www.freepascal.org/" target="_blank"&gt;http://www.freepascal.org/&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Operating Systems: Win , Linux and Mac (x86).&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Description:&lt;/P&gt;
&lt;P&gt;Lock-free threadpool.&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;The following have been added:&lt;/P&gt;
&lt;P&gt;-- Lockfree ParallelQueue for less contention and more efficiency&lt;/P&gt;
&lt;P&gt;or it can use lockfree_mpmc - flqueue that i have modified, enhanced&lt;/P&gt;
&lt;P&gt;and improved... -&lt;/P&gt;
&lt;P&gt;- It does use many queues and work-stealing - for more efficiency -&lt;/P&gt;
&lt;P&gt;- Enters in a wait state when there no job in the queue,&lt;/P&gt;
&lt;P&gt;hence, it's very efficient&lt;/P&gt;
&lt;P&gt;- You can now call any method with the excute() method, like this&lt;/P&gt;
&lt;P&gt;excute(your method, parameter);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;In Object Pascal it looks like this:&lt;/P&gt;
&lt;P&gt;TP.execute(myobj.myproc1,pointer(obj));&lt;/P&gt;
&lt;P&gt;- look inside the zipfile i have included two demos:&lt;/P&gt;
&lt;P&gt;test.pas, and ptestpool.pas - a Parallel program of Matrix&lt;/P&gt;
&lt;P&gt;multiply by a vector that use SSE+ -&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Look into defines.inc there is many options:&lt;/P&gt;
&lt;P&gt;CPU32: for 32 bits architecture&lt;/P&gt;
&lt;P&gt;MUTIPLE_PRODUCER: mutiple producer (threads)&lt;/P&gt;
&lt;P&gt;ParallelQueue: does use ParallelQueue - very efficient -&lt;/P&gt;
&lt;P&gt;Lockfree_MPMC: does use Lockfree_MPMC&lt;/P&gt;
&lt;P&gt;ParallelQueueh: does use ParallelQueueh - ParallelQueueh is for educational purpose -&lt;/P&gt;
&lt;P&gt;SINGLE_PRODUCER: for a single producer (thread)&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Required FPC switches: -Sd -dFPC -dWin32 -dFreePascal&lt;/P&gt;
&lt;P&gt;-Sd for delphi mode....&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Required Delphi switches: -DMSWINDOWS -DDelphi -$H+&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Please look at the examples test.pas,testpool.pas and test_thread.pas...&lt;/P&gt;
&lt;P&gt;Note: testpool.pas does require Delphi 5+, test.pas and test_thread.pas&lt;/P&gt;
&lt;P&gt;works with both FreePascal and Delphi&lt;/P&gt;
&lt;P&gt;You can download the new and stable version from:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://pages.videotron.com/aminer/" target="_blank"&gt;http://pages.videotron.com/aminer/&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;My Threadpool is VERY easy to use, and here is an example:&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;-------------------------------------------------------------------------------------------&lt;/P&gt;
&lt;P&gt;program test;&lt;/P&gt;
&lt;P&gt;uses&lt;/P&gt;
&lt;P&gt;{$IFDEF Delphi}&lt;/P&gt;
&lt;P&gt;cmem,&lt;/P&gt;
&lt;P&gt;{$ENDIF}&lt;/P&gt;
&lt;P&gt;ThreadPool,sysutils,windows,classes,syncobjs;&lt;/P&gt;
&lt;P&gt;type&lt;/P&gt;
&lt;P&gt;TMyThread = class (TThreadPoolThread)&lt;/P&gt;
&lt;P&gt;//procedure ProcessRequest(obj: Pointer); override;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;procedure MyProc1(obj: Pointer);&lt;/P&gt;
&lt;P&gt;procedure MyProc2(obj: Pointer);&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;var hndlArr : Array[0..19] of THandle;&lt;/P&gt;
&lt;P&gt;AId:DWORD;&lt;/P&gt;
&lt;P&gt;event1,event2:TSimpleEvent;&lt;/P&gt;
&lt;P&gt;n:int64;&lt;/P&gt;
&lt;P&gt;j:integer;&lt;/P&gt;
&lt;P&gt;myobj:TMyThread;&lt;/P&gt;
&lt;P&gt;TP: TThreadPool;&lt;/P&gt;
&lt;P&gt;obj:pointer;&lt;/P&gt;
&lt;P&gt;cs:TCriticalSection;&lt;/P&gt;
&lt;P&gt;number:integer;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;procedure TMyThread.MyProc1(obj: Pointer);&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;cs.enter;&lt;/P&gt;
&lt;P&gt;inc(number);&lt;/P&gt;
&lt;P&gt;if number=4000000 then event2.setevent;&lt;/P&gt;
&lt;P&gt;writeln(number);&lt;/P&gt;
&lt;P&gt;//writeln('This is MyProc1 with parameter: ',integer(obj));&lt;/P&gt;
&lt;P&gt;cs.leave;&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;procedure TMyThread.MyProc2(obj: Pointer);&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;cs.enter;&lt;/P&gt;
&lt;P&gt;inc(number);&lt;/P&gt;
&lt;P&gt;if number=4000000 then event2.setevent;&lt;/P&gt;
&lt;P&gt;writeln(number);&lt;/P&gt;
&lt;P&gt;//writeln('This is MyProc2 with parameter: ',integer(obj));&lt;/P&gt;
&lt;P&gt;cs.leave;&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;function StartFunc1(InVal:pointer):DWORD;&lt;/P&gt;
&lt;P&gt;var temp:tobject;&lt;/P&gt;
&lt;P&gt;i:integer;&lt;/P&gt;
&lt;P&gt;obj:pointer;&lt;/P&gt;
&lt;P&gt;func:TMyProc;&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;event1.waitfor(INFINITE);&lt;/P&gt;
&lt;P&gt;for i:=0 to 999999&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;do&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;obj:=pointer(i);&lt;/P&gt;
&lt;P&gt;TP.execute(myobj.myproc1,obj);&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;function StartFunc2(InVal:pointer):DWORD;&lt;/P&gt;
&lt;P&gt;var temp:tobject;&lt;/P&gt;
&lt;P&gt;i:integer;&lt;/P&gt;
&lt;P&gt;obj:pointer;&lt;/P&gt;
&lt;P&gt;func:TMyProc;&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;event1.waitfor(INFINITE);&lt;/P&gt;
&lt;P&gt;for i:=0 to 999999&lt;/P&gt;
&lt;P&gt;do&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;obj:=pointer(i);&lt;/P&gt;
&lt;P&gt;TP.execute(myobj.myproc1,obj);&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;function StartFunc3(InVal:pointer):DWORD;&lt;/P&gt;
&lt;P&gt;var temp:tobject;&lt;/P&gt;
&lt;P&gt;i:integer;&lt;/P&gt;
&lt;P&gt;obj:pointer;&lt;/P&gt;
&lt;P&gt;func:TMyProc;&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;event1.waitfor(INFINITE);&lt;/P&gt;
&lt;P&gt;for i:=0 to 999999&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;do&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;obj:=pointer(i);&lt;/P&gt;
&lt;P&gt;TP.execute(myobj.myproc2,obj);&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;function StartFunc4(InVal:pointer):DWORD;&lt;/P&gt;
&lt;P&gt;var temp:tobject;&lt;/P&gt;
&lt;P&gt;i:integer;&lt;/P&gt;
&lt;P&gt;obj:pointer;&lt;/P&gt;
&lt;P&gt;func:TMyproc;&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;event1.waitfor(INFINITE);&lt;/P&gt;
&lt;P&gt;for i:=0 to 999999&lt;/P&gt;
&lt;P&gt;do&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;obj:=pointer(i);&lt;/P&gt;
&lt;P&gt;TP.execute(myobj.myproc2,obj);&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;end;&lt;/P&gt;
&lt;P&gt;begin&lt;/P&gt;
&lt;P&gt;number:=0;&lt;/P&gt;
&lt;P&gt;cs:=TCriticalSection.create;&lt;/P&gt;
&lt;P&gt;myobj:=TMyThread.create;&lt;/P&gt;
&lt;P&gt;TP := TThreadPool.Create(4, 10, TMyThread);&lt;/P&gt;
&lt;P&gt;// 4 workers threads and 2^10 items for each queue.&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;event1:=TSimpleEvent.create;&lt;/P&gt;
&lt;P&gt;event2:=TSimpleEvent.create;&lt;/P&gt;
&lt;P&gt;hndlArr[0]:=BeginThread(nil,0,@StartFunc1,pointer(1),0,AId);&lt;/P&gt;
&lt;P&gt;hndlArr[1]:=BeginThread(nil,0,@StartFunc2,pointer(1),0,AId);&lt;/P&gt;
&lt;P&gt;hndlArr[2]:=BeginThread(nil,0,@StartFunc3,pointer(1),0,AId);&lt;/P&gt;
&lt;P&gt;hndlArr[3]:=BeginThread(nil,0,@StartFunc4,pointer(1),0,AId);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;event1.setevent;&lt;/P&gt;
&lt;P&gt;WaitForMultipleObjects(2, @hndlArr, True, INFINITE);&lt;/P&gt;
&lt;P&gt;event2.waitfor(INFINITE);&lt;/P&gt;
&lt;P&gt;writeln('Number is: ',number);&lt;/P&gt;
&lt;P&gt;end.&lt;/P&gt;
&lt;P&gt;----------------------------------------------------------------------------------------&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Sincerely,&lt;/P&gt;
&lt;P&gt;Amine Moulay Ramdane.&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;/SPAN&gt;</description>
      <pubDate>Fri, 26 Mar 2010 07:33:47 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Moderncode-for-Parallel/Threadpool-1-2-stable-version/m-p/860754#M2316</guid>
      <dc:creator>aminer10</dc:creator>
      <dc:date>2010-03-26T07:33:47Z</dc:date>
    </item>
  </channel>
</rss>

