//临界值操作类 class CInterCriSec { public: CInterCriSec(DWORD dwSpinCount = DEFAULT_CRISEC_SPIN_COUNT) {VERIFY(::InitializeCriticalSectionAndSpinCount(&m_crisec, dwSpinCount));} ~CInterCriSec() {::DeleteCriticalSection(&m_crisec);} void Lock() {::EnterCriticalSection(&m_crisec);} void Unlock() {::LeaveCriticalSection(&m_crisec);} BOOL TryLock() {return ::TryEnterCriticalSection(&m_crisec);} DWORD SetSpinCount(DWORD dwSpinCount) {return ::SetCriticalSectionSpinCount(&m_crisec, dwSpinCount);} CRITICAL_SECTION* GetObject() {return &m_crisec;} private: CInterCriSec(const CInterCriSec& cs); CInterCriSec operator = (const CInterCriSec& cs); private: //临界值 CRITICAL_SECTION m_crisec; }; //任务接口 class IThreadPoolTaskWork { public: enum TaskStateEnum{ wait/*等待*/,begin/*开始*/,stop/*停止*/,over/*结束*/}; friend class CThreadPool; IThreadPoolTaskWork() { m_TaskState=TaskStateEnum::wait; hThread=0; threadId=0; Number=-1; } int Number; protected: //任务的实现方式 virtual void TaskWork()=0; //线程句柄 HANDLE hThread; // 线程ID UINT threadId; //任务状态 TaskStateEnum m_TaskState; };
线程池:
class CThreadPool { protected: virtual IThreadPoolTaskWork* GetFirstTaskWork(); CInterCriSec m_lock; UINT m_MinThreadCount; UINT m_MaxThreadCount; public: struct ThreadData{ //线程句柄 HANDLE hThread; // 线程ID UINT threadId; HANDLE CompletePort; IThreadPoolTaskWork* pTaskWork; bool TaskFinish;/**显示是否完成任务**/ ThreadData(): hThread(NULL), threadId(0),CompletePort(0),TaskFinish(true),pTaskWork(NULL) { } }; int nThreadCount; HANDLE MrgCompletePort; std::vector<ThreadData*> m_threads; std::vector<IThreadPoolTaskWork *> m_Tasks; ThreadData* GetCurrentThread(); CThreadPool(void); ~CThreadPool(void); //线程池停止事件 HANDLE m_hStopEvent; //启动线程池 void BeginPool(UINT Min=3,UINT Max=3); //结束线程池 void EndPool(DWORD timeout = INFINITE); // 线程回调 void CallWorkThreadProc(HANDLE CompletePort); //添加任务 virtual void AddTaskWork(IThreadPoolTaskWork *work); //得到委完成的任务数量 int GetUnFinishTaskWork(); //激活任务 void ActiveWorkThread(); }; CThreadPool::CThreadPool(void) { nThreadCount=0; } CThreadPool::~CThreadPool(void) { } // 工作者线程回调 static unsigned __stdcall WorkerProc(LPVOID lpParameter) { CThreadPool* pThreadPool = (CThreadPool*) lpParameter; CThreadPool::ThreadData *pThread=pThreadPool->GetCurrentThread(); printf("进入线程%x \n",pThread->hThread); while (TRUE) { DWORD BytesTransferred,KEY; OVERLAPPED PerIOData; printf("等待线程:%x \n",pThread->hThread); pThreadPool->CallWorkThreadProc(pThread->CompletePort); if (GetQueuedCompletionStatus(pThread->CompletePort,&BytesTransferred,(LPDWORD)&KEY, (LPOVERLAPPED*)&PerIOData,INFINITE)) { //printf("任务完成,状态码:%d \n",GetLastError()); } //处理线程任务 } printf("退出%d \n",pThread->threadId); return 0; } //线程调度员 static unsigned __stdcall MrgThreadProc(LPVOID lpParameter) { CThreadPool* pThreadPool = (CThreadPool*) lpParameter; while(1) { DWORD BytesTransferred,KEY; OVERLAPPED PerIOData; Sleep(100); pThreadPool->ActiveWorkThread(); } } //激活任务 void CThreadPool::ActiveWorkThread() { int count=GetUnFinishTaskWork(); if(count>0) { printf("任务数%d \n",count); for(int i=0;i<this->m_threads.size();i++) { if(m_threads[i]->TaskFinish) { IThreadPoolTaskWork *work=GetFirstTaskWork(); if(work==NULL) return; this->m_lock.Lock(); m_threads[i]->TaskFinish=false; work->m_TaskState=IThreadPoolTaskWork::begin; work->hThread=m_threads[i]->hThread; work->threadId=m_threads[i]->threadId; m_threads[i]->pTaskWork=work;//给线程分配任务 this->m_lock.Unlock(); DWORD BytesTransferred=0,KEY=0; OVERLAPPED PerIOData; memset(&PerIOData,0,sizeof(OVERLAPPED)); if(!PostQueuedCompletionStatus( m_threads[i]->CompletePort, BytesTransferred, KEY, &PerIOData)) { ASSERT(0); } count=GetUnFinishTaskWork(); printf("剩余任务数%x \n",count); printf("激活线程%x,绑定任务号:%d \n",m_threads[i]->hThread,m_threads[i]->pTaskWork->Number ); } } } } void CThreadPool::BeginPool(UINT Min,UINT Max) { if(Min<=0) Min=1; nThreadCount=Min; if(Max<Min) Max=Min; this->m_MinThreadCount=Min; this->m_MaxThreadCount=Max; if(nThreadCount==0) { //SYSTEM_INFO systemInfo; //GetSystemInfo(&systemInfo); //nThreadCount = systemInfo.dwNumberOfProcessors; //if(nThreadCount<3) // nThreadCount=3; m_hStopEvent=CreateEvent(NULL,TRUE,TRUE,NULL); for(int i=0;i<nThreadCount;i++) { ThreadData* pThread = new ThreadData; pThread->CompletePort = CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,NULL,0); pThread->hThread=(HANDLE)_beginthreadex(NULL, NULL, WorkerProc, (LPVOID)this, 0, &pThread->threadId); m_threads.push_back(pThread); } MrgCompletePort = CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,NULL,0); _beginthreadex(NULL, NULL, MrgThreadProc, (LPVOID)this, 0, NULL); } } void CThreadPool::EndPool(DWORD timeout) { std::vector<HANDLE> threadHandles; for (int i = 0, count = m_threads.size(); i < count; i++) { ThreadData* thread = m_threads[i]; if (thread->hThread != NULL) { threadHandles.push_back(thread->hThread); } } if (!threadHandles.empty()) { if (m_hStopEvent != NULL) { SetEvent(m_hStopEvent); } //INFINITE 永远等待 if (WAIT_OBJECT_0 != WaitForMultipleObjects(threadHandles.size(), &threadHandles[0], TRUE, timeout)) { ASSERT(false); } for (int i = 0, count = threadHandles.size(); i < count; i++) { CloseHandle(threadHandles[i]); } } if (m_hStopEvent != NULL) { CloseHandle(m_hStopEvent); m_hStopEvent = NULL; } for (int i = 0, count = m_threads.size(); i < count; i++) { delete m_threads[i]; } m_threads.clear(); } // void CThreadPool::CallWorkThreadProc(HANDLE CompletePort){ ThreadData *pThread=GetCurrentThread(); if(pThread==NULL) return; if(pThread->pTaskWork!=NULL) { pThread->pTaskWork->TaskWork(); printf("执行完成 线程%x,任务号%d \n",pThread->hThread,pThread->pTaskWork->Number ); CInterCriSec lock; lock.Lock(); pThread->pTaskWork->m_TaskState=IThreadPoolTaskWork::over; pThread->pTaskWork=NULL; pThread->TaskFinish=true;//标记该线程空闲 lock.Unlock(); } /**/ } //添加任务 void CThreadPool::AddTaskWork(IThreadPoolTaskWork *work) { work->Number=m_Tasks.size(); m_Tasks.push_back(work); } //获取当前线程信息 CThreadPool::ThreadData* CThreadPool::GetCurrentThread() { CInterCriSec lock; lock.Lock(); DWORD threadId = ::GetCurrentThreadId(); for (int i = 0;i<m_threads.size(); i++) { if (m_threads[i]->threadId == threadId) { return m_threads[i]; } } lock.Unlock(); ASSERT(false); return NULL; } //得到第一个未分配的任务 IThreadPoolTaskWork* CThreadPool::GetFirstTaskWork() { IThreadPoolTaskWork *work=NULL; for(int i=0;i<this->m_Tasks.size();i++) { work=this->m_Tasks[i]; if(work->hThread==NULL&&work->threadId==NULL) { return work; } } return NULL; } //得到未分配的任务的数量 int CThreadPool::GetUnFinishTaskWork() { int count=0; IThreadPoolTaskWork *work=NULL; for(int i=0;i<this->m_Tasks.size();i++) { work=this->m_Tasks[i]; if(work->hThread==NULL&&work->threadId==NULL) { count++; } } return count; }