2011-12-01 81 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 –

回答