У меня есть код MFC с несколькими потоками, которые все делают рекурсивные вызовы подпрограммы с разными параметрами. В начале подпрограммы я вызываю функцию CheckKillEvent():
bool CTestShellDlg::CheckKillEvent()
{
DWORD waitS;
waitS = WaitForSingleObject(h_KillEvent, 0);
switch (waitS)
{
case WAIT_OBJECT_0:
return true;
break;
case WAIT_TIMEOUT:
return false;
break;
default:
IERROR
break;
}
}
и return() немедленно, если CheckKillEvent возвращает true.
к вашему сведению, h_killEvent инициализируется как:
h_KillEvent = CreateEvent(NULL, true, false, NULL);
т.е. он имеет ручной сброс.
Однако эти потоки, кажется, завершаются (буквально) навсегда после того, как я установил событие Kill, как показано ниже:
bool CTestShellDlg::KillThreads()
{
//Signall the killing event
SetEvent(h_KillEvent);
if (WaitForMultipleObjects(,,true,)==...)
{
ResetEvent(h_KillEvent);
return true; //Killing successful
}
else
return false; //Killing failed
}
Вопрос в том, есть ли проблема с вызовом CheckKillEvent() из нескольких потоков? Должен ли WaitForSingleObject() выполняться внутри критической секции или что-то в этом роде? Или это просто мой рекурсивный код плохо рекурсивно возвращается к точке, где он больше не вызывает себя?