Своего рода пул потоков - PullRequest
       2

Своего рода пул потоков

0 голосов
/ 02 декабря 2011

Раньше я вызывал 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 не может завершиться, и это приводит к сбою (указатель «поток» был уничтожен, но все еще используется функцией).Вероятно, есть много других проблем с моим кодом.

Как бы вы сделали это простым способом?Это легко исправить?С какими проблемами я столкнусь с этим кодом?

Спасибо!

1 Ответ

0 голосов
/ 05 декабря 2011

Почему вы имеете дело с такими низкоуровневыми API-функциями?Посмотрите на boost::thread и boost::thread_group.Также имеется реализация пула потоков работает с boost::thread.

Теперь, если ваши потоки работают в течение короткого периода времени, ваша система будет иметь значительные издержки при создании и передаче всех этих потоков.и события. ppl Параллелизм задач или tbb :: task - это, безусловно, пути.

...