我曾经为我的所有线程和WaitForMultipleObjects()调用CreateThread(),离开例程。一种线程池
为了获得更快的代码,我想做一个线程池。我的线程池有时被创建,后来被多次使用,后来被销毁(即,在程序开始时没有创建一个池)。我的线程池中的每个线程都调用具有不同参数的相同例程,线程数量不变,并且它们始终需要同时启动。
我要做的就是如下:
DWORD WINAPI runFunction(LPVOID p) {
Thread* = (Thread*) p;
while(true) {
WaitForSingleObject(thread->awakeEvenHandle, INFINITE);
thread->run();
SetEvent(thread->SleepingEventHandle);
SuspendThread(thread->handle);
}
return 0;
}
void ExecuteThreads(std::vector<Thread*> &threads) {
HANDLE* waitingEvents = new HANDLE[threads.size()];
for (int i=0; i<threads.size(); i++) {
if (threads[i]->handle == NULL) {
threads[i]->AwakeEventHandle = CreateEvent(NULL, true, false, "Awake");
threads[i]->SleepingEventHandle = CreateEvent(NULL, true, false, "Sleeping");
threads[i]->handle = CreateThread(NULL, 0. runFunction, (void*) threads[i], CREATE_SUSPENDED, NULL);
}
ResumeThread(threads[i]->handle);
ResetEvent(threads[i]->SleepingEventHandle);
SetEvent(threads[i]->AwakeEventHandle);
waitingEvents[i] = threads[i]->SleepingEventHandle;
}
WaitForMultipleObjects(threads.size(), waitingEvents, TRUE, INFINITE);
}
我的Thread类具有调用CloseHandle的为手柄SleepingEventHandle和AwakeEventHandle析构函数,和线程句柄。函数Thread :: run()是纯虚拟的,并且由编码器为实际的run()实现继承Thread。
因为它代码不起作用。一个原因是,当我不再需要这个池时,线程的析构函数被调用,但runFunction不能退出并且崩溃(指针“线程”已被销毁,但仍然使用该函数)。我的代码可能还有很多其他问题。
你会怎么做,以简单的方式?是 - 有一个简单的解决方法?我会遇到什么问题与此代码?
谢谢!
你已经涉及到这个问题。 'run()'函数可能会阻塞,所以你需要一种方式来中断它,所有实现它的类都会尊重它。 – Chad
试试看看使用线程池的windows实现。这将简化事情。以下是来自msdn杂志的一些好文章:http://msdn.microsoft.com/en-us/magazine/ee532098.aspx?sdmr=KennyKerr&sdmi=authors – Ghita
为什么不使用可用的操作系统支持而不是旋转你自己? http://msdn.microsoft.com/en-us/library/windows/desktop/ms686756%28v=vs.85%29.aspx –