Раньше я вызывал CreateThread () для всех моих потоков, а WaitForMultipleObjects () оставлял процедуру.
Чтобы получить более быстрый код, я бы хотел создать пул потоков.Мои пулы потоков иногда создаются, позже используются несколько раз, а затем уничтожаются (т. Е. В начале программы не было создано ни одного пула).Каждый поток в моем пуле потоков вызывает одну и ту же подпрограмму с разными параметрами, количество потоков постоянное, и их всегда нужно запускать одновременно.
Я делаю следующее:
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 для HANDLEs SleepingEventHandle и AwakeEventHandle, а также для дескриптора потока.Функция Thread :: run () является чисто виртуальной, и кодер должен унаследовать Thread для фактической реализации run ().
Таким образом, код не работает.Одна из причин заключается в том, что, когда мне больше не нужен этот пул, вызываются деструкторы потоков, но функция runFunction не может завершиться, и это приводит к сбою (указатель «поток» был уничтожен, но все еще используется функцией).Вероятно, есть много других проблем с моим кодом.
Как бы вы сделали это простым способом?Это легко исправить?С какими проблемами я столкнусь с этим кодом?
Спасибо!