0

我有如下代码

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。

4

1 回答 1

0

找到了 m_alive 为真的原因。

这是因为,当我们创建一个线程(通常调用“start”函数)时,调用的是不同的线程并继续执行。当“开始”完成并调用停止时,新线程尚未安排。所以“运行”没有开始。稍后运行开始时,再次将 m_alive 的值从 false 重置为 true....

于 2013-11-22T10:42:19.967 回答