关于线程池的原理及java实现,我在http://shallway.net/?p=109 有写过。我现在只是讨论下Win32下的线程池,道理一个样。
当然,除了自己实现线程池,更建议使用官方的线程池库,比如java的Executors,Windows下的ThreadPoll API(具体可查阅windows核心编程第11章),但是Windows下的线程池API只支持VISTA以上版本。。
一开始我就说过,个人不太喜欢程序里到处布满杂乱的WINDOWS API,所以仿照http://shallway.net/?p=109 ,我写了个windows下的线程池。至少经测试没有同步错误,但是效率可能差点。:)
线程池的关键就是BlockingQueue的实现,有了它后自己再创建一堆线程阻塞在上面就OK。
懒得整理了。。。我就直接搬NetWay的相关代码了。。。下面是BlockingQueue的核心实现,虽然代码不全,但是很容易还原成完整的类的,需要完整代码的课查阅NetWay源码。。。
#include "EventQueue.h"
#include
void EventQueue::enqueue(std::string e)
{
mutex.Lock();
events.push_back(e);
PulseEvent(hEventObject);
mutex.Unlock();
}
EventQueue::EventQueue(const std::string &name)
{
hEventObject = CreateEventA(NULL, // Security
FALSE, // Automatic (FALSE = not manual)
0, // Clear on creation
name.data()); // Name of object
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
exit(0);
}
}
std::string EventQueue::dequeue()
{
std::string e;
TT:
while(events.size() == 0 )
{
WaitForSingleObject(hEventObject, INFINITE);
}
mutex.Lock();
if(events.size() != 0)
{
e = events.front();
events.pop_front();
}
else
{
mutex.Unlock();
goto TT;
}
mutex.Unlock();
return e;
}
int EventQueue::size()
{
mutex.Lock();
int len = events.size();
mutex.Unlock();
return len;
}
EventQueue::~EventQueue()
{
CloseHandle(hEventObject);
}
以上代码假设BlockingQueue存储的是string对象。。还有用到了goto。。实在万不得已,要不会有同步错误。。