這是一個簡單的線程池代碼,它創(chuàng)建一個線程隊列,通過定義不同的消息,在不同的消息處理中不同的部分,這樣當啟動不同任務線程時,可以通過傳入不同參數(shù)來處理不同的處理部分。
來處理實際的部分,
單獨部分,
列出主程序代碼
#include "stdafx.h"
#include "Pool.h"
int main(int argc, char* argv[])
{
Pool
thread;
//定義1個放置線程的池
Sleep(1000);
for (int
i=0;i<10;i++)
{
thread.DoWork();
//運行池中線程
}
return
0;
}
//在建立一個線程池類,頭文件
class Pool
{
public:
//聲明為靜態(tài)函數(shù),方可在線程中建立
static DWORD WINAPI
ThreadProc(void * p);
int DoWork();
Pool();
virtual ~Pool();
private:
static CRITICAL_SECTION
sm_cs;
std::queue<DWORD>
m_qidThread; //采用了stl中的隊列存放開辟的線程
};
///////////////////////pool實現(xiàn)部分
#define MYMESSAGE (WM_USER+1000) //自定義在線程中處理的消息
#define
NUMTHREADS
10
CRITICAL_SECTION
Pool::sm_cs;
//聲明一個臨界區(qū),當在線程下操作界
//面時,必須考慮到這是不能在線程下跑的
Pool::Pool()
{
::InitializeCriticalSection(&sm_cs);
for (int
i=0;i<10;i++)
//工作時立即創(chuàng)建10個線程,并保存在線程隊列中
{
DWORD
dw;
HANDLE thread = ::CreateThread(NULL, 0, ThreadProc, NULL, 0,
&dw);
::CloseHandle(thread);
m_qidThread.push(dw);
}
}
Pool::~Pool()
{
while
(!m_qidThread.empty())
{
::PostThreadMessage(m_qidThread.front(),
WM_QUIT, 0, 0);
//通知線程你要退出了
m_qidThread.pop();
}
::DeleteCriticalSection(&sm_cs);
}
DWORD WINAPI Pool::ThreadProc(void *p)
{
MSG msg;
while (::GetMessage(&msg, NULL, 0, 0)>0)
{
switch (msg.message)
{
case
MYMESSAGE:
//////////////////////////////////////
// 這里加入自己的實際代碼
//
// ::EnterCriticalSection(&sm_cs);
std::cout
<< "Hello World! from Thread Number: " << ::GetCurrentThreadId()
<<
std::endl;
// ::LeaveCriticalSection(&sm_cs);
case
MYMESSAGE2:
//可以加更多的自定義消息
// 。。。。
break;
default:
break;
};
};
return 0;
}
//DoWork 完全可以帶參數(shù)進去調用不同的消息體部分
int Pool::DoWork()
{
DWORD dw = m_qidThread.front();
::PostThreadMessage(dw, MYMESSAGE, 0, 0);
//通知處理自定義消息部分的實際內容了
m_qidThread.pop();
m_qidThread.push(dw);
return 0;
}