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 が true である理由を見つけました。

これは、スレッドを作成すると (通常は "start" 関数を呼び出します)、呼び出されたスレッドが別のスレッドにあり、実行を継続したためです。「開始」が完了して停止を呼び出すまでに、新しいスレッドはまだスケジュールされていません。したがって、「実行」は開始されません。後で実行が開始されると、m_alive の値を false から true に再度リセットします....

于 2013-11-22T10:42:19.967 に答える