线程池
2016-02-19 18:06
267 查看
工程源码下载地址
http://download.csdn.net/detail/u012607841/9437028
vs2008编译,当然大家可以改成vc6.0的工程
ThreadPool.h
ThreadPool.cpp
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; } }
相关文章推荐
- center与centering之间的区别
- 操作csv文件
- 圆角背景ListVIew的实现方法
- 关于js实现SSE的简单实践
- mysql基础使用
- [php] 对数内的字符串用str_replace进行替换的技巧
- Git常用命令
- POJ 3020 Antenna Placement(无向二分图的最小路径覆盖)
- ifconfig,netstat 命令找不到解決办法
- Objective C类方法load和initialize的区别
- 基于zhphpWeixinApi.class.php开发微信+ 百度API翻译案例
- Oracle 12C RAC的optimizer_adaptive_features造成数据插入超时
- 实现从网页上抓取数据(htmlparser)
- YII2+PHPEXCEL
- 【理解】线段树中树链存储方式
- 关于使用 QEMU 对系统进行 profile
- java 面试题
- 制作framework库文件的详细步骤---iOS9,Xcode7.2
- shell脚本教程
- 每天学习一点儿 swift