ÉèΪÊ×Ò³ ¼ÓÈëÊÕ²Ø

TOP

VCʵÏÖÏ̳߳Ø(¶þ)
2014-11-23 21:30:27 ¡¾´ó ÖРС¡¿ ä¯ÀÀ:1355´Î
Tags£ºÊµÏÖ Ïß³Ì
pThreadPool->WorkItemSemaphore = CreateSemaphore(NULL, 0, 0x7FFFFFFF, NULL);
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; iThreadNum; 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);
ReleaseSemaphore(pThreadPool->WorkItemSemaphore, 1, NULL);

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
Ê×Ò³ ÉÏÒ»Ò³ 1 2 3 ÏÂÒ»Ò³ βҳ 2/3/3
¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿ ¡¾·±Ìå¡¿¡¾Í¶¸å¡¿¡¾Êղء¿ ¡¾ÍƼö¡¿¡¾¾Ù±¨¡¿¡¾ÆÀÂÛ¡¿ ¡¾¹Ø±Õ¡¿ ¡¾·µ»Ø¶¥²¿¡¿
ÉÏһƪ£ºADOµÚÒ»´ÎÇ×ÃܽӴ¥¨DADO¿ª·¢Êµ¼ùÖ.. ÏÂһƪ£ºVisual C++±¾µØ²¢Ðбà³ÌÖеÄ״̬..

×îÐÂÎÄÕÂ

ÈÈÃÅÎÄÕÂ

Hot ÎÄÕÂ

Python

C ÓïÑÔ

C++»ù´¡

´óÊý¾Ý»ù´¡

linux±à³Ì»ù´¡

C/C++ÃæÊÔÌâÄ¿