【发布时间】:2012-07-09 11:14:54
【问题描述】:
我正在使用 FreeGLUT 在 Linux 中开发一个多线程 C++ 应用程序。奇怪的是,在我的一个线程中调用 exit() 会导致调用并完成 onexit() 回调,但无法退出我的程序。根据 GDB,它会挂在 GLUT 库中的 select() 调用中。
我还有一个键盘回调,当我按“q”时退出。如果我在程序挂起时按“q”,GLUT 会正常退出。
似乎没有人遇到类似的问题。文档说 exit() 应该关闭整个进程,而不仅仅是一个线程,所以不是那样的。我难住了。你有什么想法吗?
编辑:我发现了问题。我错了退出处理程序已经完成。一个库函数调用正在等待一个在调用 exit() 时已经锁定的互斥锁。 GLUT 只是利用了空闲时间。谢谢大家的回复。
【问题讨论】:
-
显示一些代码,或者我们所能做的就是猜猜哪里出了问题。
-
创建显示此行为的最小可编译示例并发布。
-
将
while (true) { }放入静态析构函数可能会有效地完成同样的事情。你有回溯,这意味着你已经成功了一半。您的代码的哪一部分调用了 GLUT?也许你应该戳一些信号量或信号来通知系统的其余部分是时候离开了。 -
exit() 文档是在没有线程概念的情况下编写的(因为 C 在语言级别没有线程的概念)。在 C 中,您可以在其中找到 exit() 线程的文档是通过外部库添加的。因此,您需要阅读线程库文档,了解当您从不是原始进程线程的线程调用 exit() 时会发生什么。它可能不便携。
标签: c++ linux glut exit freeglut