线程池


工程源码下载地址

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;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值