Domanda

Ho un codice come sotto

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 (...)
    {
    }
}
.

Sto cercando di uscire dal processo con grazia.Ma il problema è molto raramente vedo che quel programma si blocca in unione.

Il filo è ancora attivo in infinito mentre loop.M_Alive Value è "Vero" anche dopo che è chiamato STOP (in Arresto è impostato su FALSE).M_Alive è dichiarato come volatile.

È stato utile?

Soluzione

Trovato il motivo per cui M_Alive è vero.

È perché, quando creiamo un thread (in generale chiamando la funzione "Start") chiamato è in discussione diversa e ha continuato la sua esecuzione.Al momento "Start" completa e chiama la fermata, il nuovo filo non è ancora programmato.Quindi "corre" non è iniziato.Quando inizierà l'esecuzione successiva, resettare il valore di M_Alive da False a TRUE di nuovo ....

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top