一种线程池

时间:2011-12-01 20:53:16

标签: c++ windows multithreading threadpool

我曾经为我的所有线程调用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有一个析构函数,它为HANDLEs SleepingEventHandle和AwakeEventHandle以及线程句柄调用CloseHandle。函数Thread :: run()是纯虚拟的,并且由编码器继承Thread以实现实际的run()实现。

因为它,代码不起作用。一个原因是,当我不再需要这个池时,会调用Threads的析构函数,但runFunction无法退出并且崩溃(指针&#34; thread&#34;已被破坏但仍被使用功能)。我的代码可能还有很多其他问题。

你会如何以简单的方式做到这一点?是否有一个简单的解决方案?这段代码会遇到什么问题?

谢谢!

1 个答案:

答案 0 :(得分:0)

为什么你必须处理这种低级api函数?看看boost::thread and boost::thread_group。另外还有thread pool implementationboost::thread合作。

现在,如果您的线程在短时间内工作,那么您的系统将在创建和发送所有线程和事件时产生显着的开销。 ppl Task Parallelismtbb::task绝对是您的最佳选择。