这个问题看起来可能是重复的,但我找不到。如果我错过了之前的问题,抱歉。
在 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(使用前将#替换为@)