A junção de thread espera para sempre:juntar trava ou espera para sempre
-
26-12-2019 - |
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.
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....