以下のようなコードがあります
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 (...)
{
}
}
プロセスを正常に終了しようとしています。しかし、問題はめったにありません。参加時にプログラムがハングすることはほとんどありません。
スレッドは、無限 while ループでまだアクティブです。stop が呼び出された後でも、m_alive 値は「true」です (stop では false に設定されます)。m_alive は volatile として宣言されています。