exit()和exit_group()之间有什么区别?任何具有多个线程的进程都应该使用exit_group而不是exit?
回答问题why do you ask
- 我们的流程大约有40个线程。线程被锁定后,我们会自动退出该进程,然后重新启动该进程。然后我们打印被锁定的线程的回溯。我们想知道在这种情况下调用exit是否与exit_group不同。
From the docs: This system call is equivalent to exit(2) except that it terminates not only the calling thread, but all threads in the calling process's thread group
- 但是,退出进程和退出所有线程之间的区别是什么。不会退出进程==退出所有主题。
答案 0 :(得分:4)
我所知道的所有线程库(例如最近的glibc或musl-libc)都在使用低级clone(2) system call进行线程实现(有些C库甚至是使用clone
到fork
进程)。
clone
是一个困难的Linux系统调用。除非你是一个线程库实现者,否则你不应该直接使用 ,而只能通过库函数(例如pthread_create(3));另请参阅futex(7) *
函数
clone
系统调用用于创建任务:线程(在多线程进程中共享地址空间)或进程。
exit_group
系统调用与退出这些任务有关。
简而言之,您永远不会直接使用 exit_group或clone
。你的libc正在为你做这件事。所以不要关心exit_group
或_Exit
;你应该只使用标准库函数exit(3),它特别涉及atexit(3)&amp; on_exit(3)注册处理程序并刷新<stdio.h>
个缓冲区。在极少数情况下,您不希望发生这种情况,请使用_exit(2)(但您可能不需要)。
当然,如果您从头开始重新实现自己的libc
,则需要关注exit_group
&amp; clone
;但除此之外你不关心它们。。
如果您关心血腥实施细节,请深入了解libc
的源代码。详细信息可能是libc
- 版本,内核 -version和特定于编译器!