gpt4 book ai didi

linux - Linux 中的线程生命周期

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:53:36 24 4
gpt4 key购买 nike

目前,我正在尝试了解当共享库生成一个线程时会发生什么,该线程不会终止,然后共享库将被卸载。

如果父线程不等待线程退出,线程会发生什么?线程是死掉还是保持运行状态?

如果确实如此,那么父进程如何检测到它何时被卸载并以某种方式终止线程?

感谢您的帮助。

最佳答案

我假设共享库是一些在运行时使用 dlopen(3) 动态加载的插件然后使用 dlclose 显式卸载。

dlopendlclose 函数在内部使用引用计数器,它们是 mmap(2) -ing(对于 dlopen)和 munmap-ing(对于 dlclose)ELF 中的一些段在适当的时候共享对象(即当 ref 计数器越过 0 边界时)。

如果线程正在 dlclose-d 共享库中运行某个函数,该函数的代码将变为 munmap-ed,并且一旦您跳转(或返回进入)那个函数,你会得到一个 SIGBUS、SIGILL 或 SIGSEGV 信号。

所以您不希望发生 munmap:因此您可以:

  1. 避免调用dlclose;这在实践中非常有效(除非你有一个服务器程序),因为 mmap 消耗了共享对象的文本只读段的大部分地址空间。作为我的manydl.c演示,您可以在桌面上dlopen 数十万个共享对象而不会达到严重限制。

  2. 或将 RTLD_NODELETE 传递给 dlopen 要求它永远不取消映射库

或者,使用一些工具(即共享库中的 destructor 属性函数)或约定(可能是 atexit(3) ?)确保线程在 dlclose 之前结束

关于linux - Linux 中的线程生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24927241/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com