我曾經爲我的所有線程和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 –