[英]Thread lifetime in linux
目前,我正在尝试了解当共享库生成一个线程时会发生什么,该线程不会终止,然后卸载共享库。
如果父节点没有等待线程退出,线程会发生什么? 线程是否死亡或是否仍处于运行状态?
如果确实如此,那么父如何检测它何时被卸载并以某种方式终止该线程?
谢谢你的帮助。
我假设共享库是一些在运行时使用dlopen(3)动态加载的插件,后来使用dlclose
显式卸载。
dlopen
和dlclose
函数在内部使用引用计数器,它们是mmap(2) -ing(用于dlopen
)和munmap
-ing(用于dlclose
)适当时ELF共享对象内的一些段(即当ref计数器越过0时)边界)。
如果一个线程在dlclose
-d共享库中运行某个函数,那么该函数的代码将变为munmap
-ed,并且只要您跳转(或返回)该函数,就会得到SIGBUS,SIGILL或SIGSEGV信号。
所以你不希望这个munmap
发生:因此你可以:
避免调用dlclose
; 这在实践中非常有效(除非你有一个服务器程序),因为mmap
主要占用共享对象的文本只读段的地址空间。 正如我manydl.c演示,你可以dlopen
成千上万的在桌面上的共享对象没有达到严重的限制。
或者将RTLD_NODELETE
传递给dlopen
要求它永远不要取消映射库
或者,使用一些工具(即共享库中的析构函数 -属性函数)或约定(也许是atexit(3) ?)来确保线程在dlclose
之前已经结束
共享库被加载到进程中,因此生成的线程将在进程地址空间中运行。
如果没有注意到退出,线程将继续运行。 当进程退出时,线程也将被终止。
由于共享库产生了线程,所以共享库最好还提供一个注意线程退出的函数,这样进程可以在卸载库之前调用函数退出线程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.