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 |