2011-12-01 79 views
0

我曾经为我的所有线程和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不能退出并且崩溃(指针“线程”已被销毁,但仍然使用该函数)。我的代码可能还有很多其他问题。

你会怎么做,以简单的方式?是 - 有一个简单的解决方法?我会遇到什么问题与此代码?

谢谢!

+0

你已经涉及到这个问题。 'run()'函数可能会阻塞,所以你需要一种方式来中断它,所有实现它的类都会尊重它。 – Chad

+0

试试看看使用线程池的windows实现。这将简化事情。以下是来自msdn杂志的一些好文章:http://msdn.microsoft.com/en-us/magazine/ee532098.aspx?sdmr=KennyKerr&sdmi=authors – Ghita

+1

为什么不使用可用的操作系统支持而不是旋转你自己? http://msdn.microsoft.com/en-us/library/windows/desktop/ms686756%28v=vs.85%29.aspx –

回答