繁体   English   中英

linux中的线程生命周期

[英]Thread lifetime in linux

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

如果父节点没有等待线程退出,线程会发生什么? 线程是否死亡或是否仍处于运行状态?

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

谢谢你的帮助。

我假设共享库是一些在运行时使用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要求它永远不要取消映射库

或者,使用一些工具(即共享库中的析构函数 -属性函数)或约定(也许是atexit(3) ?)来确保线程在dlclose之前已经结束

共享库被加载到进程中,因此生成的线程将在进程地址空间中运行。

如果没有注意到退出,线程将继续运行。 当进程退出时,线程也将被终止。

由于共享库产生了线程,所以共享库最好还提供一个注意线程退出的函数,这样进程可以在卸载库之前调用函数退出线程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM