pThreadPool->WorkItemCount = 0;
InitializeListHead(&pThreadPool->WorkItemHeader);
InitializeCriticalSection(&pThreadPool->WorkItemLock);
pThreadPool->ThreadNum = ThreadNum;
pThreadPool->ThreadsArray = (HANDLE*)malloc(sizeof(HANDLE) * ThreadNum);
for(int i=0; i
pThreadPool->ThreadsArray[i] = CreateThread(NULL, 0, WorkerThread, pThreadPool, 0, NULL);
}
return TRUE;
}
VOID DestroyThreadPool(PTHREAD_POOL pThreadPool)
{
SetEvent(pThreadPool->QuitEvent);
for(int i=0; i
{
WaitForSingleObject(pThreadPool->ThreadsArray[i], INFINITE);
CloseHandle(pThreadPool->ThreadsArray[i]);
}
free(pThreadPool->ThreadsArray);
CloseHandle(pThreadPool->QuitEvent);
CloseHandle(pThreadPool->WorkItemSemaphore);
DeleteCriticalSection(&pThreadPool->WorkItemLock);
while(!IsListEmpty(&pThreadPool->WorkItemHeader))
{
PWORK_ITEM pWorkItem;
PLIST_ENTRY pList;
pList = RemoveHeadList(&pThreadPool->WorkItemHeader);
pWorkItem = CONTAINING_RECORD(pList, WORK_ITEM, List);
free(pWorkItem);
}
}
BOOL PostWorkItem(PTHREAD_POOL pThreadPool, WORK_ITEM_PROC UserProc, PVOID UserParam)
{
PWORK_ITEM pWorkItem = (PWORK_ITEM)malloc(sizeof(WORK_ITEM));
if(pWorkItem == NULL)
return FALSE;
pWorkItem->UserProc = UserProc;
pWorkItem->UserParam = UserParam;
EnterCriticalSection(&pThreadPool->WorkItemLock);
InsertTailList(&pThreadPool->WorkItemHeader, &pWorkItem->List);
LeaveCriticalSection(&pThreadPool->WorkItemLock);
InterlockedIncrement(&pThreadPool->WorkItemCount);
return TRUE;
}
VOID UserProc1(PVOID dwParam)
{
WorkItem(dwParam);
}
void TestSimpleThreadPool(BOOL bWaitMode, LONG ThreadNum)
{
THREAD_POOL ThreadPool;
InitializeThreadPool(&ThreadPool, ThreadNum);
CompleteEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
BeginTime = GetTickCount();
ItemCount = 20;
for(int i=0; i<20; i++)
{
PostWorkItem(&ThreadPool, UserProc1, (PVOID)bWaitMode);
}
WaitForSingleObject(CompleteEvent, INFINITE);
CloseHandle(CompleteEvent);
DestroyThreadPool(&ThreadPool);
}
ÎÒÃǰѹ¤×÷ÏîÄ¿·Åµ½Ò»¸ö¶ÓÁÐÖУ¬ÓÃÒ»¸öÐźÅÁ¿Í¨ÖªÏ̳߳أ¬Ï̳߳ØÖÐÈÎÒâÒ»¸öÏß³ÌÈ¡³ö¹¤×÷ÏîÄ¿À´Ö´ÐУ¬Ö´ÐÐÍê±ÏÖ®ºó£¬Ï̷߳µ»ØÏ̳߳أ¬¼ÌÐøµÈ´ýÐµĹ¤×÷ÏîÄ¿¡£
Ï̳߳ØÖÐÏ̵߳ÄÊýÁ¿Êǹ̶¨µÄ£¬Ô¤ÏÈ´´½¨ºÃµÄ£¬ÓÀ¾ÃµÄỊ̈߳¬Ö±µ½Ïú»ÙÏ̳߳صÄʱºò£¬ÕâЩÏ̲߳ŻᱻÏú»Ù¡£
Ï̳߳ØÖÐÏ̻߳ñµÃ¹¤×÷ÏîÄ¿µÄ»ú»áÊǾùµÈµÄ£¬Ëæ»úµÄ£¬²¢Ã»ÓÐÌØ±ðµÄ·½Ê½±£Ö¤ÄÄÒ»¸öÏ߳̾ßÓÐÌØÊâµÄÓÅÏÈ»ñµÃ¹¤×÷ÏîÄ¿µÄ»ú»á¡£
¶øÇÒ£¬Í¬Ò»Ê±¿Ì¿ÉÒÔ²¢·¢ÔËÐеÄÏß³ÌÊýĿûÓÐÈκÎÏÞ¶¨¡£ÊÂʵÉÏ£¬ÔÚÎÒÃǵÄÖ´ÐмÆËãÈÎÎñµÄÑÝʾ´úÂëÖУ¬ËùÓеÄÏ̶߳¼²¢·¢Ö´ÐС£
ÏÂÃæ£¬ÎÒÃÇÔÙÀ´¿´Ò»Ï£¬Íê³ÉͬÑùµÄÈÎÎñ£¬ÏµÍ³ÌṩµÄÏ̳߳ØÊÇÈçºÎÔË×÷µÄ¡£
/************************************************************************/
/* QueueWorkItem Test. */
/************************************************************************/
DWORD BeginTime;
LONG ItemCount;
HANDLE CompleteEvent;
int compute()
{
srand(BeginTime);
for(int i=0; i<20 *1000 * 1000; i++)
rand();
return rand();
}
DWORD WINAPI WorkItem(LPVOID lpParameter)
{
BOOL bWai