我正在开发游戏,所以有一点我不得不使用fork()
,主线程运行opengl图形,子线程运行游戏逻辑。
现在我遇到了问题。在某些时候,用户可以按下游戏内的“退出”按钮,该按钮由辅助线程处理。此外,在某些时候,用户可以点击X按钮退出由主(过剩)线程处理的游戏。所以这是我的问题:如何杀死其他正在运行的线程,并退出?
现在,如果我关闭窗口,第二个线程继续运行,如果第二个线程完成,第一个线程继续运行。
使用atexit
功能可以处理“X”按钮,但我还没有找到(安全)杀死glutMainLoop()
的方法。
答案 0 :(得分:1)
如果您实际上正在调用fork()
(而不是启动新线程),那么您实际上正在创建另一个正在运行的进程。调用fork()
时,它会将process-id返回给父进程。这可以传递给kill()
来杀死进程。在linux下,这看起来像:
#include <signal.h>
pid_t pid = fork();
if (pid == 0) {
// you are in the child process
} else if (pid > 0) {
// you are in the parent process
...
// send a termination signal
kill(pid, SIGTERM);
} else {
// fork had an error which should be logged...
}
您需要选择发送进程的信号。例如,SIGKILL(9)很难杀死它。
答案 1 :(得分:0)
请准确了解thread
和process
,因为它们描述了不同的主题。
由于您使用fork()
,因此您实际上正在处理流程。我建议你改用threads
,因为它的内存效率要高得多(因为程序只需要在内存中一次)并且更容易处理。当然,你必须自己处理关键部分。
Here是使用线程的一个很好的例子。
如果您坚持使用流程和fork()
,您仍然可以发送信号并实施特定的信号处理程序。我还阅读了一些关于IPC(进程间通信)的文章,如http://tldp.org/LDP/lpg/node7.html。