могут ли несколько потоков зависеть от одного ручного события Kill?

У меня есть код 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() выполняться внутри критической секции или что-то в этом роде? Или это просто мой рекурсивный код плохо рекурсивно возвращается к точке, где он больше не вызывает себя?


person Community    schedule 18.12.2014    source источник
comment
Нет, такой код нормально работает. Если поток застрял в вызове операционной системы, который блокируется, поэтому не вызывается CheckKillEvent(), это было бы типичным зависанием. Это легко узнать с помощью окна Threads отладчика.   -  person Hans Passant    schedule 19.12.2014
comment
хорошо спасибо. да, заработало после некоторой отладки. вы можете добавить этот комментарий в качестве ответа.   -  person    schedule 19.12.2014


Ответы (1)


Как предположил Ганс в комментарии, проблема на самом деле заключалась в блокировке помпы сообщений. Всегда лучше назначать отдельные потоки для задач, которые могут занять много времени или могут сами потребовать доступа к насосу сообщений.

person Community    schedule 21.12.2014