您的位置:首页 > 其它

线程池

2016-02-19 18:06 267 查看
工程源码下载地址
http://download.csdn.net/detail/u012607841/9437028
vs2008编译,当然大家可以改成vc6.0的工程

ThreadPool.h

#pragma once
#include <windows.h>

#ifndef XC_API
#define XC_API extern "C"
#endif

typedef  unsigned int(__stdcall *WORKERPROC)(void * lpParameter, DWORD userData);
typedef struct _ThreadPool
{
HANDLE hIoCompletionPort;
HANDLE hExitEvent;
DWORD  dwUserData;
HANDLE hThread[MAXIMUM_WAIT_OBJECTS];
LONG  dwItemCount;  //线程池中还未完成的数量
}ThreadPool, *HThreadPool;

XC_API HThreadPool WINAPI XThreadPool_Create();
XC_API void WINAPI XThreadPool_Destroy(HThreadPool hThreadPool);
XC_API void WINAPI XThreadPool_PostItem(HThreadPool hThreadPool, WORKERPROC userWorker, LPVOID lpParam, DWORD userData);
XC_API void WINAPI XThreadPool_SuspendAll(HThreadPool hThreadPool);
XC_API void WINAPI XThreadPool_ResumeAll(HThreadPool hThreadPool);
XC_API DWORD WINAPI XThread


ThreadPool.cpp

#include "ThreadPool.h"
#include <process.h>

unsigned int WINAPI Worker(void* lpParam)
{
HThreadPool pThreadPool = (HThreadPool)lpParam;

DWORD dwUserData;
WORKERPROC userCallBack = NULL;
LPVOID      lParam;
while (WaitForSingleObject(pThreadPool->hExitEvent, 0) != WAIT_OBJECT_0)
{
if (GetQueuedCompletionStatus(
pThreadPool->hIoCompletionPort,
&dwUserData,
(PULONG)&userCallBack,
(LPOVERLAPPED*)&lParam,
INFINITE
))
{
if (userCallBack)
{
userCallBack(lParam, dwUserData);
InterlockedDecrement(&pThreadPool->dwItemCount);
}

}
}
return 0;
}

void WINAPI XThreadPool_PostItem(HThreadPool hThreadPool, WORKERPROC userWorker, LPVOID lpParam, DWORD userData)
{
if (hThreadPool)
{
PostQueuedCompletionStatus(
hThreadPool->hIoCompletionPort,
userData,
(ULONG_PTR)userWorker,
(LPOVERLAPPED)lpParam
);
InterlockedIncrement(&hThreadPool->dwItemCount);
}
}
void WINAPI XThreadPool_SuspendAll(HThreadPool hThreadPool)
{
if (hThreadPool)
{
for (int i = 0; i < MAXIMUM_WAIT_OBJECTS; i++)
{
SuspendThread(hThreadPool->hThread[i]);
}
}
}

DWORD WINAPI XThreadPool_GetWorkItem(HThreadPool hThreadPool)
{
if (hThreadPool)
{
return hThreadPool->dwItemCount;
}
return 0;
}

void WINAPI XThreadPool_ResumeAll(HThreadPool hThreadPool)
{
if (hThreadPool)
{
for (int i = 0; i < MAXIMUM_WAIT_OBJECTS; i++)
{
ResumeThread(hThreadPool->hThread[i]);
}
}
}

HThreadPool WINAPI XThreadPool_Create()
{
HThreadPool pThreadPool = new ThreadPool;
pThreadPool->hIoCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, NULL, 0);
pThreadPool->hExitEvent = CreateEventW(NULL, TRUE, FALSE, NULL);
pThreadPool->dwItemCount = 0;

for (int i = 0; i < MAXIMUM_WAIT_OBJECTS; i++)
{
pThreadPool->hThread[i] = (HANDLE)_beginthreadex(
NULL, 0,
Worker, (void*)pThreadPool, 0, NULL);
}
return pThreadPool;
}

void WINAPI XThreadPool_Destroy(HThreadPool hThreadPool)
{
if (hThreadPool)
{
SetEvent(hThreadPool->hExitEvent);
for (int i = 0; i < MAXIMUM_WAIT_OBJECTS; i++)
{
// 通知所有的完成端口操作退出
PostQueuedCompletionStatus(hThreadPool->hIoCompletionPort, 0, 0, NULL);
}
WaitForMultipleObjects(MAXIMUM_WAIT_OBJECTS, hThreadPool->hThread, TRUE, INFINITE);
for (int j = 0; j < MAXIMUM_WAIT_OBJECTS; j++)
{
CloseHandle(hThreadPool->hThread[j]);
}
CloseHandle(hThreadPool->hIoCompletionPort);

delete hThreadPool;
hThreadPool = NULL;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: