exit() 和 exit_group() 有什么区别?任何具有多个线程的进程都应该使用 exit_group 而不是退出?
为了回答why do you ask
的问题 - 我们有一个有大约 40 个线程的进程。当线程被锁定时,我们会自动退出进程,然后重新启动进程。我们打印被锁定的线程的回溯。我们想知道在这种情况下调用退出是否与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
- 但是,退出进程和退出所有线程有什么区别。不是退出进程 == 退出所有线程。
我知道的所有线程库(例如最近的 glibc 或 musl-libc)都在使用低级 clone(2) 系统调用来实现它们的线程实现(有些 C 库甚至使用 clone
来fork
进程)。
clone
是一个困难的Linux系统调用。除非你是线程库实现者,否则你不应该直接使用它,而只能通过库函数使用它(例如 pthread_create(3));另请参见 pthread_mutex *
函数中使用的 futex(7)
clone
syscall 用于创建任务:线程(在多线程进程中共享地址空间)或进程。
exit_group
系统调用与退出这些任务有关。
简而言之,您永远不会直接使用 exit_group 或 clone
.您的 libc 正在为您做到这一点。所以不要在乎exit_group
或_Exit
;您应该只使用标准库函数 exit(3),它主要处理 atexit(3) 和on_exit(3) 注册的处理程序并刷新缓冲区<stdio.h>
。在极少数情况下,您不希望发生这种情况,请使用 _exit(2)(但您可能不需要它)。
当然,如果你从头开始重新实现自己的libc
,你需要关心exit_group
和clone
;但除此之外,你并不关心它们。
如果您关心血腥的实现细节,请深入了解libc
的源代码。详细信息可能libc
版本、内核版本和编译器特定!