我有一个如下代码
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 (...)
{
}
}
我正在尝试优雅地退出流程。但问题是我很少看到程序在加入时挂起。
线程在无限循环中仍处于活动状态。即使在调用stop之后,m_alive值仍为“true”(在stop中将其设置为false)。 m_alive被声明为volatile。
答案 0 :(得分:0)
找到m_alive为真的原因。
因为,当我们创建一个线程(通常调用“start”函数)时,调用的是不同的线程并继续执行。当“开始”完成并且调用停止时,新线程尚未安排。所以“跑步”没有开始。当稍后运行开始时,再次将m_alive的值从false重置为true ....