这是一个简单的线程池代码,它创建一个线程队列,通过定义不同的消息,在不同的消息处理中不同的部分,这样当启动不同任务线程时,可以通过传入不同参数来处理不同的处理部分。
来处理实际的部分,
单独部分,
列出主程序代码
#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:
//声明为静态函数,方可在线程中建立
static DWORD WINAPI
ThreadProc(void * p);
int DoWork();
Pool();
virtual ~Pool();
private:
static CRITICAL_SECTION
sm_cs;
std::queue<DWORD>
m_qidThread; //采用了stl中的队列存放开辟的线程
};
///////////////////////pool实现部分
#define MYMESSAGE (WM_USER+1000) //自定义在线程中处理的消息
#define
NUMTHREADS
10
CRITICAL_SECTION
Pool::sm_cs;
//声明一个临界区,当在线程下操作界
//面时,必须考虑到这是不能在线程下跑的
Pool::Pool()
{
::InitializeCriticalSection(&sm_cs);
for (int
i=0;i<10;i++)
//工作时立即创建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 完全可以带参数进去调用不同的消息体部分
int Pool::DoWork()
{
DWORD dw = m_qidThread.front();
::PostThreadMessage(dw, MYMESSAGE, 0, 0);
//通知处理自定义消息部分的实际内容了
m_qidThread.pop();
m_qidThread.push(dw);
return 0;
}