Pergunta

Eu tenho um código como abaixo

void CLogThread::run()
{
    m_alive = True;  //only place where m_alive (declared volatile) set to true 

    while (m_alive)
    {
        //logic here
    }   
}


void CLogThread::stop()
{
    m_alive = False;
}




void CThreadManager::uninit() throw()
{
    try
    {
        if (m_pLogThread != NULL)
        {
            m_pLogThread->stop();
            (void)m_pLogThread->getThreadControl().join();
            m_pLogThread->uninit();
            m_pLogThread = NULL;    
        }

    }
    catch (...)
    {
    }
}

Estou tentando sair do processo normalmente.Mas o problema é que muito raramente vejo esse programa travar na junção.

Thread ainda está ativo em loop while infinito.O valor m_alive é "true" mesmo depois que stop é chamado (em stop é definido como false).m_alive é declarado como volátil.

Foi útil?

Solução

Encontrou a razão pela qual m_alive é verdadeiro.

É porque, quando criamos um thread (geralmente chamando a função "start") chamado está em um thread diferente e ele continua sua execução.No momento em que o "início" é concluído e as chamadas param, o novo thread ainda não foi agendado.Então "corra" não começou.Quando a execução posterior for iniciada, redefina o valor de m_alive de falso para verdadeiro novamente....

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top