有没有办法仅使用C++或Windows C++函数创建线程池? 我无法访问boost或任何库(我可以访问code project,但找不到非Unix的任何内容),而且我很难找到一种实现线程池的方法。
我正在使用VS2010,它尚不支持C++11线程,这就是为什么我有些困惑的原因!
有没有办法仅使用C++或Windows C++函数创建线程池? 我无法访问boost或任何库(我可以访问code project,但找不到非Unix的任何内容),而且我很难找到一种实现线程池的方法。
我正在使用VS2010,它尚不支持C++11线程,这就是为什么我有些困惑的原因!
class threadPool;
class task {
friend class threadPool;
private:
threadPool *myPool;
public:
virtual void run()=0;
};
class PCSqueue{
private:
CRITICAL_SECTION access;
deque<task*> *objectQueue;
HANDLE queueSema;
public:
PCSqueue();
void push(task *ref);
bool pop(task **ref,DWORD timeout);
};
class threadPool {
private:
int threadCount;
public:
PCSqueue *queue;
threadPool(int initThreads);
static DWORD _stdcall staticThreadRun(void *param){
threadPool *myPool=(threadPool *)param;
task *thisTask;
while (myPool->queue->pop(&thisTask,INFINITE)){
thisTask->run();
}
}
void submit(task *aTask);
};
// C++
PCSqueue::PCSqueue(){
objectQueue=new deque<task*>;
InitializeCriticalSection(&access);
queueSema=CreateSemaphore(NULL,0,MAXINT,NULL);
};
void PCSqueue::push(task *ref){
EnterCriticalSection(&access);
objectQueue->push_front(ref);
LeaveCriticalSection(&access);
ReleaseSemaphore(queueSema,1,NULL);
};
bool PCSqueue::pop(task **ref,DWORD timeout){
if (WAIT_OBJECT_0==WaitForSingleObject(queueSema,timeout)) {
EnterCriticalSection(&access);
*ref=objectQueue->back();
objectQueue->pop_back();
LeaveCriticalSection(&access);
return(true);
}
else
return(false);
};
threadPool::threadPool(int initThreads){
queue=new PCSqueue();
for(threadCount=0;threadCount!=initThreads;threadCount++){
CreateThread(NULL,0,staticThreadRun,this,0,0);
};
};
void threadPool::submit(task *aTask){
aTask->myPool=this;
queue->push(aTask);
};
有一个用于管理线程池的API,这是链接:http://msdn.microsoft.com/en-us/library/windows/desktop/ms686766(v=vs.85).aspx。你可能需要找到一个包装它的库,因为它相当复杂。