【问题标题】:linux system crash after game exit退出游戏后linux系统崩溃
【发布时间】:2011-03-27 06:29:41
【问题描述】:

我在电视的linux系统上运行我的游戏,当我退出游戏时,系统会崩溃。

从输出日志中,我知道我的游戏一直很正常,但是系统崩溃了。

主要功能如下:

int main(int argc, char** argv)
{
 ......

 SDL_Quit();

 printf("Log: exit end. \n);// it's printed on console
 return 0;
}

我可以找到关于 Log: exit end 的输出日志。所以游戏已经退出了吧?

我发现游戏退出只会在创建线程后崩溃。

这是下面线程中的运行函数:

   while ( pThread->m_running )
    {
        string str;
        string cmdStr;

        if ( pThread->GetSendMsg(str, cmdStr) )
        {
            string returnStr = Connection::DealHttpSendMsg( str, cmdStr );

            pThread->AddReturnMsg( returnStr ); 

            haveData = true;
        }
        else
        {
            SDL_Delay(100);

            haveData = false;
        }
    }

我的问题是,如果m_running 始终为真。所以当我退出游戏时,线程仍在运行。会不会导致崩溃?

【问题讨论】:

    标签: linux multithreading crash


    【解决方案1】:

    如果该线程尝试访问正在被主线程同时销毁的资源,它会这样做。

    如果您有一个不执行任何操作的工作线程,则退出应用程序不会导致应用程序崩溃。

    #include <stdio.h>
    #include <unistd.h>
    #include <pthread.h>
    
    void* run_me(void*)
    {
        while (1) 
        { 
           printf("Sleeping..\n");
           sleep(1);
        }
    }
    
    int main()
    {
        pthread_t my_thread;
    
        pthread_create(&my_thread, NULL, &run_me, NULL);
        sleep(2);
    
        return 0;
    }
    

    【讨论】:

    • 我更新了运行功能。你能帮我检查一下吗?我是编程新手。非常感谢。
    • 我已经说明了问题,但会再试一次。您正在工作线程中使用 pThread 对象。我敢打赌这个对象是在 main() 中声明的(但它现在没有显示在你的代码中)。当 main() 结束时,它在那里分配/构造的所有内容都会被释放。问题是您的工作线程继续尝试引用不再存在的对象。这就是它崩溃的原因。
    • 理想情况下,您应该在 return 0; 之前更改 main() 函数上的 pThread-&gt;m_running 的状态,这样工作线程就会离开 while 循环。在 main() 上添加一条语句并在离开应用程序之前等待工作线程 join 也很重要。查看此参考以了解如何等待线程:pages.cs.wisc.edu/~travitch/pthreads_primer.html
    • 非常感谢您的帮助!我想我明白了。
    【解决方案2】:

    return 0; 只终止主线程。尝试改用 exit(0)。

    【讨论】:

    • 你的意思是当主线程已经退出,子线程还在运行时会导致crash?
    猜你喜欢
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    相关资源
    最近更新 更多