windows线程池的一种简单实现
问题描述:在windows环境下实现一种简单的线程池,用可以简单地向线程池提交任务函数和参数。
一些常量定义:
/************************************************************************** *常量的定义 ***************************************************************************/ #ifndef __CONSTANT_H #define __CONSTANT_H #define NAME_LEN 1024 #define TRUE 1 #define FALSE 0 typedef int BOOL; #endif
任务结构的设计:
/************************************************************************** *任务的结构定义 ***************************************************************************/ #ifndef __TASK_H #define __TASK_H #include <Windows.h> #include "Constant.h" typedef DWORD (WINAPI *TaskFunction)(LPVOID);//定义任务函数 typedef struct TaskNode_t //定义一个任务节点,用来管理用户提交的任务的 { HANDLE accessMutex; //访问控制互斥量 TaskFunction myTask;//任务函数 void * arg; //任务函数所需要的参数 int taskID; //任务函数的ID char taskName[NAME_LEN]; //任务函数的名字,主要是为了能够标识这一个任务,具体是什么值并不重要 TaskNode_t * next; }TaskNode, *pTaskNode; typedef struct TaskList_t //任务链表,用户所提交的任务结点都会加入到这个链表当中,其实这是个队列,先入先出 { HANDLE accessMutex; //互斥量的作用用于控制链表的访问,保证插入和删除操作按顺序来,不会同时发生 pTaskNode head; pTaskNode tail; int total; }TaskList, *pTaskList; pTaskNode createTaskNode(TaskFunction myfunc, void * myarg, int id, char * name); void deleteTaskNode(pTaskNode pNode); pTaskList createAndInitTaskList( ); void deleteTaskList(pTaskList pList); void pushTaskListTail(pTaskList pList, pTaskNode pNode); pTaskNode popTaskListHead(pTaskList pList); int getRemainedTaskNumber(pTaskList pList); void printTaskList(pTaskList pList); #endif
线程管理结构设计:
/************************************************************************** *线程管理结构 ***************************************************************************/ #ifndef __THREAD_H #define __THREAD_H #include "Constant.h" #include "Task.h" typedef struct ThreadControl_t //控制线程的信息结构 { pTaskNode pTask; //任务指针 BOOL isAlive; //标识线程是否是活动的,就是没有被销毁 BOOL isFree; //标识线程是否是空闲的,如果是空闲的,就可以分配任务,否则表明线程正在执行任务函数 int threadID; //线程ID char threadName[NAME_LEN]; //线程的名字,这个也是标识一个线程的,主要是为了作观察输出用. HANDLE threadEvent; //事件内核对象,用于控制线程的执行 HANDLE please; //事件内核对象指针 HANDLE threadHandle; //线程句柄 ThreadControl_t * next; }ThreadControl, *pThreadControl; typedef struct ThreadList_t //线程信息结构链表 { HANDLE accessMutex; pThreadControl head; pThreadControl tail; int total; }ThreadList, *pThreadList; //常用的操作定义 pThreadControl createThreadControl(BOOL alive, BOOL free, int id, char* name, HANDLE p); void deleteThreadControl(pThreadControl p); pThreadList createAndInitThreadList( ); void deleteThreadList(pThreadList p); void pushThreadListTail(pThreadList pList, pThreadControl pControl); pThreadControl popThreadListHead(pThreadList pList); void printThreadList(pThreadList pList); pThreadControl findFreeThread(pThreadList pList); int getFreeThreadNumber(pThreadList pList); int getTotalThreadNumber(pThreadList pList); #endif
线程池的数据结构:
/************************************************************************** *线程池结构 ***************************************************************************/ #ifndef __THREADTASKPOOL_H #define __THREADTASKPOOL_H #include <Windows.h> #include "Constant.h" #include "Task.h" #include "Thread.h" typedef struct ThreadTaskPool_t { pTaskList taskList; pThreadList threadList; HANDLE pleaseDispatch; //这个事件在任务队列新加入一个元素或线程队列某一个线程执行完任务后设置为有信号 HANDLE accessMutex; //访问互斥量 }ThreadTaskPool, *pThreadTaskPool; pThreadTaskPool createAndInitThreadTaskPool(int number); //创建并初始化 void addTaskToThreadTaskPool(pThreadTaskPool pPool, TaskFunction func, void * arg); //向线程池提交一个任务 void wait(pThreadTaskPool pPool); //用户提交完所有任务后,调用wait函数等待线程池处理完所有任务 BOOL deleteThreadTaskPool(pThreadTaskPool pPool); //删除线程池 void printThreadTaskPool(pThreadTaskPool pPool); //打印线程池信息 #endif