⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vc实现线程池_programing repository.mht

📁 线程池的源码模压可耕地可耕地枯可耕地在村枯枯枯要要要求
💻 MHT
📖 第 1 页 / 共 5 页
字号:
    <TD>
      <DIV=20
      =
class=3Dcnt>=D5=E2=C1=BD=CC=EC=D4=DA=D7=F6=B9=D8=D3=DA=CD=F8=C2=E7=D6=A9=D6=
=EB=B5=C4=B3=CC=D0=F2,=CF=A3=CD=FB=BF=C9=D2=D4=CD=A8=B9=FD=CF=DF=B3=CC=B3=
=D8=C0=B4=CC=E1=B8=DF=B3=CC=D0=F2=B5=C4=D0=D4=C4=DC,=CD=F8=C9=CF=CB=D1=CB=
=F7=C1=CB=D2=BB=CF=C2,=BF=B4=B5=BD=D5=E2=B7=BD=C3=E6=B5=C4=B6=AB=CE=F7=BB=
=B9=B2=BB=C9=D9,=B8=FA=B4=F3=BC=D2=B7=D6=CF=ED=D2=BB=CF=C2!~=D3=D0=D0=ED=B6=
=E0=D3=A6=D3=C3=B3=CC=D0=F2=B4=B4=BD=A8=B5=C4=CF=DF=B3=CC=BB=A8=B7=D1=C1=CB=
=B4=F3=C1=BF=CA=B1=BC=E4=D4=DA=CB=AF=C3=DF=D7=B4=CC=AC=C0=B4=B5=C8=B4=FD=CA=
=C2=BC=FE=B5=C4=B7=A2=C9=FA=A1=A3=BB=B9=D3=D0=D2=BB=D0=A9=CF=DF=B3=CC=BD=F8=
=C8=EB=CB=AF=C3=DF=D7=B4=CC=AC=BA=F3=B6=A8=C6=DA=B1=BB=BB=BD=D0=D1=D2=D4=C2=
=D6=D1=AF=B9=A4=D7=F7=B7=BD=CA=BD=C0=B4=B8=C4=B1=E4=BB=F2=D5=DF=B8=FC=D0=C2=
=D7=B4=CC=AC=D0=C5=CF=A2=A1=A3=CF=DF=B3=CC=B3=D8=BF=C9=D2=D4=C8=C3=C4=E3=B8=
=FC=D3=D0=D0=A7=B5=D8=CA=B9=D3=C3=CF=DF=B3=CC=A3=AC=CB=FC=CE=AA=C4=E3=B5=C4=
=D3=A6=D3=C3=B3=CC=D0=F2=CC=E1=B9=A9=D2=BB=B8=F6=D3=C9=CF=B5=CD=B3=B9=DC=C0=
=ED=B5=C4=B9=A4=D7=F7=D5=DF=CF=DF=B3=CC=B3=D8=A1=A3=D6=C1=C9=D9=BB=E1=D3=D0=
=D2=BB=B8=F6=CF=DF=B3=CC=C0=B4=BC=E0=CC=FD=B7=C5=B5=BD=CF=DF=B3=CC=B3=D8=B5=
=C4=CB=F9=D3=D0=B5=C8=B4=FD=B2=D9=D7=F7=A3=AC=B5=B1=B5=C8=B4=FD=B2=D9=D7=F7=
=CD=EA=B3=C9=BA=F3=A3=AC=CF=DF=B3=CC=B3=D8=D6=D0=BD=AB=BB=E1=D3=D0=D2=BB=B8=
=F6=B9=A4=D7=F7=D5=DF=CF=DF=B3=CC=C0=B4=D6=B4=D0=D0=CF=E0=D3=A6=B5=C4=BB=D8=
=B5=F7=BA=AF=CA=FD=A1=A3<BR>&nbsp;&nbsp;=20
      =
=C4=E3=D2=B2=BF=C9=D2=D4=B0=D1=C3=BB=D3=D0=B5=C8=B4=FD=B2=D9=D7=F7=B5=C4=B9=
=A4=D7=F7=CF=EE=C4=BF=B7=C5=B5=BD=CF=DF=B3=CC=B3=D8=D6=D0=A3=AC=D3=C3Queu=
eUserWorkItem=BA=AF=CA=FD=C0=B4=CD=EA=B3=C9=D5=E2=B8=F6=B9=A4=D7=F7=A3=AC=
=B0=D1=D2=AA=D6=B4=D0=D0=B5=C4=B9=A4=D7=F7=CF=EE=C4=BF=BA=AF=CA=FD=CD=A8=B9=
=FD=D2=BB=B8=F6=B2=CE=CA=FD=B4=AB=B5=DD=B8=F8=CF=DF=B3=CC=B3=D8=A1=A3=B9=A4=
=D7=F7=CF=EE=C4=BF=B1=BB=B7=C5=B5=BD=CF=DF=B3=CC=B3=D8=D6=D0=BA=F3=A3=AC=BE=
=CD=B2=BB=C4=DC=D4=D9=C8=A1=CF=FB=C1=CB=A1=A3<BR>&nbsp;&nbsp;=20
      Timer-queue timers=BA=CDRegistered wait=20
      =
operations=D2=B2=CA=B9=D3=C3=CF=DF=B3=CC=B3=D8=C0=B4=CA=B5=CF=D6=A1=A3=CB=
=FB=C3=C7=B5=C4=BB=D8=B5=F7=BA=AF=CA=FD=D2=B2=B7=C5=D4=DA=CF=DF=B3=CC=B3=D8=
=D6=D0=A1=A3=C4=E3=D2=B2=BF=C9=D2=D4=D3=C3BindIOCompletionCallback=BA=AF=CA=
=FD=C0=B4=CD=B6=B5=DD=D2=BB=B8=F6=D2=EC=B2=BDIO=B2=D9=D7=F7=A3=AC=D4=DAIO=
=CD=EA=B3=C9=B6=CB=BF=DA=C9=CF=A3=AC=BB=D8=B5=F7=BA=AF=CA=FD=D2=B2=CA=C7=D3=
=C9=CF=DF=B3=CC=B3=D8=CF=DF=B3=CC=C0=B4=D6=B4=D0=D0=A1=A3<BR>&nbsp;&nbsp;=
=20
      =
=B5=B1=B5=DA=D2=BB=B4=CE=B5=F7=D3=C3QueueUserWorkItem=BA=AF=CA=FD=BB=F2=D5=
=DFBindIOCompletionCallback=BA=AF=CA=FD=B5=C4=CA=B1=BA=F2=A3=AC=CF=DF=B3=CC=
=B3=D8=B1=BB=D7=D4=B6=AF=B4=B4=BD=A8=A3=AC=BB=F2=D5=DFTimer-queue=20
      timers=BB=F2=D5=DFRegistered wait=20
      =
operations=B7=C5=C8=EB=BB=D8=B5=F7=BA=AF=CA=FD=B5=C4=CA=B1=BA=F2=A3=AC=CF=
=DF=B3=CC=B3=D8=D2=B2=BF=C9=D2=D4=B1=BB=B4=B4=BD=A8=A1=A3=CF=DF=B3=CC=B3=D8=
=BF=C9=D2=D4=B4=B4=BD=A8=B5=C4=CF=DF=B3=CC=CA=FD=C1=BF=B2=BB=CF=DE=A3=AC=BD=
=F6=CA=DC=CF=DE=D3=DA=BF=C9=D3=C3=B5=C4=C4=DA=B4=E6=A3=AC=C3=BF=D2=BB=B8=F6=
=CF=DF=B3=CC=CA=B9=D3=C3=C4=AC=C8=CF=B5=C4=B3=F5=CA=BC=B6=D1=D5=BB=B4=F3=D0=
=A1=A3=AC=D4=CB=D0=D0=D4=DA=C4=AC=C8=CF=B5=C4=D3=C5=CF=C8=BC=B6=C9=CF=A1=A3=
<BR>&nbsp;&nbsp;=20
      =
=CF=DF=B3=CC=B3=D8=D6=D0=D3=D0=C1=BD=D6=D6=C0=E0=D0=CD=B5=C4=CF=DF=B3=CC=A3=
=BAIO=CF=DF=B3=CC=BA=CD=B7=C7IO=CF=DF=B3=CC=A1=A3IO=CF=DF=B3=CC=B5=C8=B4=FD=
=D4=DA=BF=C9=B8=E6=BE=AF=D7=B4=CC=AC=A3=AC=B9=A4=D7=F7=CF=EE=C4=BF=D7=F7=CE=
=AAAPC=B7=C5=B5=BDIO=CF=DF=B3=CC=D6=D0=A1=A3=C8=E7=B9=FB=C4=E3=B5=C4=B9=A4=
=D7=F7=CF=EE=C4=BF=D0=E8=D2=AA=CF=DF=B3=CC=D6=B4=D0=D0=D4=DA=BF=C9=BE=AF=B8=
=E6=D7=B4=CC=AC=A3=AC=C4=E3=D3=A6=B8=C3=BD=AB=CB=FC=B7=C5=B5=BDIO=CF=DF=B3=
=CC=A1=A3<BR>&nbsp;&nbsp;=20
      =
=B7=C7IO=B9=A4=D7=F7=D5=DF=CF=DF=B3=CC=B5=C8=B4=FD=D4=DAIO=CD=EA=B3=C9=B6=
=CB=BF=DA=C9=CF=A3=AC=CA=B9=D3=C3=B7=C7IO=CF=DF=B3=CC=B1=C8IO=CF=DF=B3=CC=
=D0=A7=C2=CA=B8=FC=B8=DF=A3=AC=D2=B2=BE=CD=CA=C7=CB=B5=A3=AC=D6=BB=D2=AA=D3=
=D0=BF=C9=C4=DC=B5=C4=BB=B0=A3=AC=BE=A1=C1=BF=CA=B9=D3=C3=B7=C7IO=CF=DF=B3=
=CC=A1=A3IO=CF=DF=B3=CC=BA=CD=B7=C7IO=CF=DF=B3=CC=D4=DA=D2=EC=B2=BDIO=B2=D9=
=D7=F7=C3=BB=D3=D0=CD=EA=B3=C9=D6=AE=C7=B0=B6=BC=B2=BB=BB=E1=CD=CB=B3=F6=A1=
=A3=C8=BB=B6=F8=A3=AC=B2=BB=D2=AA=D4=DA=B7=C7IO=CF=DF=B3=CC=D6=D0=B7=A2=B3=
=F6=D0=E8=D2=AA=BA=DC=B3=A4=CA=B1=BC=E4=B2=C5=C4=DC=CD=EA=B3=C9=B5=C4=D2=EC=
=B2=BDIO=C7=EB=C7=F3=A1=A3<BR>&nbsp;&nbsp;=20
      =
=D5=FD=C8=B7=CA=B9=D3=C3=CF=DF=B3=CC=B3=D8=B5=C4=B7=BD=B7=A8=CA=C7=A3=AC=B9=
=A4=D7=F7=CF=EE=C4=BF=BA=AF=CA=FD=D2=D4=BC=B0=CB=FC=BD=AB=BB=E1=B5=F7=D3=C3=
=B5=BD=B5=C4=CB=F9=D3=D0=BA=AF=CA=FD=B6=BC=B1=D8=D0=EB=CA=C7=CF=DF=B3=CC=B3=
=D8=B0=B2=C8=AB=B5=C4=A1=A3=B0=B2=C8=AB=B5=C4=BA=AF=CA=FD=B2=BB=D3=A6=B8=C3=
=BC=D9=C9=E8=CF=DF=B3=CC=CA=C7=D2=BB=B4=CE=D0=D4=CF=DF=B3=CC=B5=C4=BB=F2=D5=
=DF=CA=C7=D3=C0=BE=C3=CF=DF=B3=CC=A1=A3=D2=BB=B0=E3=C0=B4=CB=B5=A3=AC=D3=A6=
=B8=C3=B1=DC=C3=E2=CA=B9=D3=C3=CF=DF=B3=CC=B1=BE=B5=D8=B4=E6=B4=A2=BA=CD=B7=
=A2=B3=F6=D0=E8=D2=AA=D3=C0=BE=C3=CF=DF=B3=CC=B5=C4=D2=EC=B2=BDIO=B5=F7=D3=
=C3=A3=AC=B1=C8=C8=E7=CB=B5RegNotifyChangeKeyValue=BA=AF=CA=FD=A1=A3=C8=E7=
=B9=FB=D0=E8=D2=AA=D4=DA=D3=C0=BE=C3=CF=DF=B3=CC=D6=D0=D6=B4=D0=D0=D5=E2=D1=
=F9=B5=C4=BA=AF=CA=FD=B5=C4=BB=B0=A3=AC=BF=C9=D2=D4=B8=F8QueueUserWorkIte=
m=B4=AB=B5=DD=D2=BB=B8=F6=D1=A1=CF=EEWT_EXECUTEINPERSISTENTTHREAD=A1=A3<B=
R>&nbsp;&nbsp;=20
      =
=D7=A2=D2=E2=A3=AC=CF=DF=B3=CC=B3=D8=B2=BB=C4=DC=BC=E6=C8=DDCOM=B5=C4=B5=A5=
=CF=DF=B3=CC=CC=D7=BC=E4=A3=A8STA=A3=A9=C4=A3=D0=CD=A1=A3<BR>&nbsp;&nbsp;=
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      =
=CE=AA=C1=CB=B8=FC=C9=EE=C8=EB=B5=D8=BD=B2=BD=E2=B2=D9=D7=F7=CF=B5=CD=B3=CA=
=B5=CF=D6=B5=C4=CF=DF=B3=CC=B3=D8=B5=C4=D3=C5=D4=BD=D0=D4=A3=AC=CE=D2=C3=C7=
=CA=D7=CF=C8=B3=A2=CA=D4=D7=C5=D7=D4=BC=BA=CA=B5=CF=D6=D2=BB=B8=F6=BC=F2=B5=
=A5=B5=C4=CF=DF=B3=CC=B3=D8=C4=A3=D0=CD=A1=A3<BR>&nbsp;&nbsp;<BR>&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      =B4=FA=C2=EB=C8=E7=CF=C2=A3=BA<BR>&nbsp;&nbsp;&nbsp;=20
      =
/**//********************************************************************=
****/<BR>&nbsp;&nbsp;=20
      /**//* Test Our own thread=20
      =
pool.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      */<BR>&nbsp;&nbsp;=20
      =
/**//********************************************************************=
****/<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;=20
      typedef struct _THREAD_POOL<BR>&nbsp;&nbsp;=20
      {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HANDLE=20
      QuitEvent;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HANDLE=20
      =
WorkItemSemaphore;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;=20
      LONG WorkItemCount;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =
LIST_ENTRY=20
      WorkItemHeader;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =
CRITICAL_SECTION=20
      =
WorkItemLock;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =
LONG=20
      ThreadNum;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HANDLE=20
      *ThreadsArray;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp; }THREAD_POOL,=20
      *PTHREAD_POOL;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp; typedef VOID=20
      (*WORK_ITEM_PROC)(PVOID Param);<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp; =
typedef=20
      struct _WORK_ITEM<BR>&nbsp;&nbsp;=20
      {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LIST_ENTRY=20
      List;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      WORK_ITEM_PROC UserProc;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =
PVOID=20
      UserParam;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp; =

      }WORK_ITEM, =
*PWORK_ITEM;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;=20
      DWORD WINAPI WorkerThread(PVOID pParam)<BR>&nbsp;&nbsp;=20
      {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PTHREAD_POOL pThreadPool =
=3D=20
      (PTHREAD_POOL)pParam;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =
HANDLE=20
      =
Events[2];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;=20
      Events[0] =3D=20
      pThreadPool-&gt;QuitEvent;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =

      Events[1] =3D=20
      =
pThreadPool-&gt;WorkItemSemaphore;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;=20
      for(;;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =
DWORD=20
      dwRet =3D WaitForMultipleObjects(2, Events, FALSE,=20
      =
INFINITE);<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;=20
      if(dwRet =3D=3D=20
      =
WAIT_OBJECT_0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      =
break;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;=20
      //<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =
//=20
      execute user's=20
      =
proc.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      =
//<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;=20
      else if(dwRet =3D=3D WAIT_OBJECT_0=20
      =
+1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      =
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;=20
      PWORK_ITEM=20
      =
pWorkItem;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;=20
      PLIST_ENTRY=20
      =
pList;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      =
EnterCriticalSection(&amp;pThreadPool-&gt;WorkItemLock);<BR>&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      =
_ASSERT(!IsListEmpty(&amp;pThreadPool-&gt;WorkItemHeader));<BR>&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;=20
      pList =3D=20
      =
RemoveHeadList(&amp;pThreadPool-&gt;WorkItemHeader);<BR>&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      =
LeaveCriticalSection(&amp;pThreadPool-&gt;WorkItemLock);<BR>&nbsp;&nbsp;<=
BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;=20
      pWorkItem =3D CONTAINING_RECORD(pList, WORK_ITEM,=20
      =
List);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;=20
      =
pWorkItem-&gt;UserProc(pWorkItem-&gt;UserParam);<BR>&nbsp;&nbsp;<BR>&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;=20
      =
InterlockedDecrement(&amp;pThreadPool-&gt;WorkItemCount);<BR>&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =

      =
free(pWorkItem);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;=20
      =
}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;=20
      =
else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      =
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;=20
      =
_ASSERT(0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;=20
      =
break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      }<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return=20
      0;<BR>&nbsp;&nbsp; }<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp; BOOL=20
      InitializeThreadPool(PTHREAD_POOL pThreadPool, LONG=20
      ThreadNum)<BR>&nbsp;&nbsp; =
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      pThreadPool-&gt;QuitEvent =3D CreateEvent(NULL, TRUE, FALSE,=20
      NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      pThreadPool-&gt;WorkItemSemaphore =3D CreateSemaphore(NULL, 0, =
0x7FFFFFFF,=20
      NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      pThreadPool-&gt;WorkItemCount =3D =
0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      =
InitializeListHead(&amp;pThreadPool-&gt;WorkItemHeader);<BR>&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;=20
      =
InitializeCriticalSection(&amp;pThreadPool-&gt;WorkItemLock);<BR>&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      pThreadPool-&gt;ThreadNum =3D=20
      ThreadNum;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      pThreadPool-&gt;ThreadsArray =3D (HANDLE*)malloc(sizeof(HANDLE) *=20
      =
ThreadNum);<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      for(int i=3D0; i&lt;ThreadNum; =
i++)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      pThreadPool-&gt;ThreadsArray[i] =3D CreateThread(NULL, 0, =
WorkerThread,=20
      pThreadPool, 0, NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      }<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return=20
      TRUE;<BR>&nbsp;&nbsp; }<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp; VOID=20
      DestroyThreadPool(PTHREAD_POOL pThreadPool)<BR>&nbsp;&nbsp;=20
      {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      =
SetEvent(pThreadPool-&gt;QuitEvent);<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;=20
      for(int i=3D0; i&lt;pThreadPool-&gt;ThreadNum;=20
      i++)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      WaitForSingleObject(pThreadPool-&gt;ThreadsArray[i],=20
      =
INFINITE);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;=20
      =
CloseHandle(pThreadPool-&gt;ThreadsArray[i]);<BR>&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;=20
      }<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      =
free(pThreadPool-&gt;ThreadsArray);<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;=20
      =
CloseHandle(pThreadPool-&gt;QuitEvent);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;=20
      =
CloseHandle(pThreadPool-&gt;WorkItemSemaphore);<BR>&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;=20
      =
DeleteCriticalSection(&amp;pThreadPool-&gt;WorkItemLock);<BR>&nbsp;&nbsp;=
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      =
while(!IsListEmpty(&amp;pThreadPool-&gt;WorkItemHeader))<BR>&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;=20
      {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      PWORK_ITEM=20
      =
pWorkItem;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;=20
      PLIST_ENTRY=20
      =
pList;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR=
>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      pList =3D=20
      =
RemoveHeadList(&amp;pThreadPool-&gt;WorkItemHeader);<BR>&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      pWorkItem =3D CONTAINING_RECORD(pList, WORK_ITEM,=20
      =
List);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR=
>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      free(pWorkItem);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =
}<BR>&nbsp;&nbsp;=20
      }<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp; BOOL PostWorkItem(PTHREAD_POOL=20
      pThreadPool, WORK_ITEM_PROC UserProc, PVOID =
UserParam)<BR>&nbsp;&nbsp;=20
      {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PWORK_ITEM pWorkItem =3D =

      =
(PWORK_ITEM)malloc(sizeof(WORK_ITEM));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;=20
      if(pWorkItem =3D=3D=20
      =
NULL)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      return =
FALSE;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      pWorkItem-&gt;UserProc =3D =
UserProc;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      pWorkItem-&gt;UserParam =3D=20
      UserParam;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =

      =
EnterCriticalSection(&amp;pThreadPool-&gt;WorkItemLock);<BR>&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;=20
      InsertTailList(&amp;pThreadPool-&gt;WorkItemHeader,=20
      &amp;pWorkItem-&gt;List);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      =
LeaveCriticalSection(&amp;pThreadPool-&gt;WorkItemLock);<BR>&nbsp;&nbsp;<=
BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      =
InterlockedIncrement(&amp;pThreadPool-&gt;WorkItemCount);<BR>&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      ReleaseSemaphore(pThreadPool-&gt;WorkItemSemaphore, 1,=20
      NULL);<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =
return=20
      TRUE;<BR>&nbsp;&nbsp; }<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp; VOID=20
      UserProc1(PVOID dwParam)<BR>&nbsp;&nbsp;=20
      {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      WorkItem(dwParam);<BR>&nbsp;&nbsp; =
}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp; void=20
      TestSimpleThreadPool(BOOL bWaitMode, LONG =
ThreadNum)<BR>&nbsp;&nbsp;=20
      {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; THREAD_POOL=20
      =
ThreadPool;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;=20
      InitializeThreadPool(&amp;ThreadPool,=20
      =
ThreadNum);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;=20
      CompleteEvent =3D CreateEvent(NULL, FALSE, FALSE,=20
      NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BeginTime =3D=20
      GetTickCount();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ItemCount =
=3D=20
      20;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =
for(int i=3D0;=20
      i&lt;20; i++)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      PostWorkItem(&amp;ThreadPool, UserProc1,=20
      (PVOID)bWaitMode);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      =
}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;=20
      WaitForSingleObject(CompleteEvent,=20
      INFINITE);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      =
CloseHandle(CompleteEvent);<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;=20
      DestroyThreadPool(&amp;ThreadPool);<BR>&nbsp;&nbsp;=20
      }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
      =
=CE=D2=C3=C7=B0=D1=B9=A4=D7=F7=CF=EE=C4=BF=B7=C5=B5=BD=D2=BB=B8=F6=B6=D3=C1=
=D0=D6=D0=A3=AC=D3=C3=D2=BB=B8=F6=D0=C5=BA=C5=C1=BF=CD=A8=D6=AA=CF=DF=B3=CC=
=B3=D8=A3=AC=CF=DF=B3=CC=B3=D8=D6=D0=C8=CE=D2=E2=D2=BB=B8=F6=CF=DF=B3=CC=C8=
=A1=B3=F6=B9=A4=D7=F7=CF=EE=C4=BF=C0=B4=D6=B4=D0=D0=A3=AC=D6=B4=D0=D0=CD=EA=
=B1=CF=D6=AE=BA=F3=A3=AC=CF=DF=B3=CC=B7=B5=BB=D8=CF=DF=B3=CC=B3=D8=A3=AC=BC=

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -