我曾经为我的所有线程调用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;已被破坏但仍被使用功能)。我的代码可能还有很多其他问题。
你会如何以简单的方式做到这一点?是否有一个简单的解决方案?这段代码会遇到什么问题?
谢谢!
答案 0 :(得分:0)
为什么你必须处理这种低级api函数?看看boost::thread
and boost::thread_group
。另外还有thread pool implementation与boost::thread
合作。
现在,如果您的线程在短时间内工作,那么您的系统将在创建和发送所有线程和事件时产生显着的开销。 ppl Task Parallelism或tbb::task绝对是您的最佳选择。