Thread Join attendi per sempre: unisciti a sospendere o attendere per sempre
-
26-12-2019 - |
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.
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 ....