Linux C++:从 main() 返回是否会导致多线程应用程序终止?

2024-04-07

这个问题看起来可能是重复的,但我找不到。如果我错过了之前的问题,抱歉。

在 Java 中,我有大部分经验,如果你的 main() 分叉一个线程并立即返回,进程将继续运行,直到进程中的所有(非守护进程)线程都停止。

在 C++ 中,情况似乎并非如此 - 一旦主线程返回,进程就会终止,而其他线程仍在运行。对于我当前的应用程序,这可以通过应用轻松解决pthread_join()但我想知道是什么导致了这种行为。这个编译器 (gcc) 是特定的、pthreads 特定的,还是在大多数/所有已实现 C++ 的平台上共享的行为?这种行为是否可以在 pthreads 中配置(我已经查看了 pthread apipthread_attr_*()功能,但没有看到任何看起来相关的东西。)?

完全独立的问题,但是当你在这里时......人们会使用什么pthread_detatch() for?


是的。在现代 Linux 中(更重要的是更新版本的 GNU libc)exit_group是main返回时使用的系统调用,不是普通的exit. exit_group描述如下:

这个系统调用相当于 exit(2) 除非它终止 仅调用线程,但所有 调用进程中的线程 线程组。

值得注意的是,当前的 C++ 标准使得没有提及线程,因此此行为不是特定于 C++ 的,而是特定于您的特定实现的。也就是说,我个人见过的每个实现都会在主线程终止时杀死所有线程。

EDIT:还值得注意的是 Jonathan Leffler 的回答,它指出 POSIX 标准确实指定了这种行为,因此对于使用 pthreads 进行线程处理的应用程序来说这当然是正常的。

EDIT:回答后续问题pthread_detach。基本上,如果您不加入非分离线程,则被视为资源泄漏。如果您有一个长时间运行的任务,不需要“等待”,并且它只是“结束时结束”,那么您应该分离它,当它在没有连接的情况下终止时,不会出现资源泄漏。手册页内容如下:

pthread_detach() 函数标记 线程标识为 超然的。当一个分离的线程 终止,其资源为 自动释放回 无需另一个系统 与终止的线程连接 线。

因此,一个快速而肮脏的答案是:“当您不关心它何时结束时,请将其分离。如果另一个线程关心它何时结束并且必须等待它终止,那么就不要这样做。”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux C++:从 main() 返回是否会导致多线程应用程序终止? 的相关文章

随机推荐