Cwinthread
От: ahaos  
Дата: 09.04.15 21:46
Оценка:
Здравствуйте!

Создается группа потоков, число которых равно числу ядер.

Ниже представлен упрощенный код.

CAVector<CWinThread*> pwth;
hnd.SetSize(GetCPUNumber());
pwth.SetSize(GetCPUNumber());

for (int i=1;i<=GetCPUNumber();i++)
{

//Создание потока расчета
pwth[i]=AfxBeginThread(CalculatePeriodicCukP,(LPVOID)pi,THREAD_PRIORITY_BELOW_NORMAL,NULL,CREATE_SUSPENDED);

if (pwth[i]==NULL)
{
AfxMessageBox ("Ошибка создания потока расчета");
return NULL;
}

pwth[i]->m_bAutoDelete=false;
pwth[i]->ResumeThread();

hnd[i]=pwth[i]->m_hThread;

}

//Ожидание конца расчета во всех потоках
HANDLE* mhnd;
mhnd=new HANDLE [hnd.GetSize()];

for (int i=1;i<=hnd.GetSize();i++)
mhnd[i-1]=hnd[i];

WaitForMultipleObjects(hnd.GetSize(),mhnd,true,INFINITE);


DWORD st;
for (int i = 1; i <= pwth.GetSize(); i++)
{
if (pwth[i] != NULL)
{
::TerminateThread(pwth[i]->m_hThread, st);
::CloseHandle(pwth[i]->m_hThread);
delete pwth[i];

}
}


Данная процедура происходит периодически и после достаточно большого количества итераций выдает сообщение "Ошибка создания потока расчета".
Поскольку используется m_bAutoDelete=false, то явно просматривается проблема некорректного удаления объекта CWinthread. Как это сделать корректно.
При попытке использования delete pwth[i] выдает ошибку. CAVector — самопальный массив.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.