У меня есть код MFC с несколькими потоками, которые делают рекурсивные вызовы подпрограмме с разными параметрами. В начале подпрограммы, я делаю вызов функции CheckKillEvent():Может ли несколько потоков зависеть от одного ручного события Kill-event?
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;
}
}
и возвращение() немедленно, если CheckKillEvent возвращает истину.
FYI, 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() выполняться внутри критического раздела или что-то еще? Или это просто мой рекурсивный код, плохо реагирующий на то, что он больше не называет себя?
Нет, этот код обычно работает нормально. Наличие потока, застрявшего в вызове операционной системы, который блокирует, поэтому не вызывать CheckKillEvent(), будет типичным зависанием. Легко узнать в окне Threads отладчика. –
ОК спасибо. да, он работал после некоторой отладки. вы можете добавить этот комментарий в качестве ответа. –