gpt4 book ai didi

multithreading - dlclose 时共享库产生的线程会发生什么

转载 作者:行者123 更新时间:2023-12-03 13:15:14 25 4
gpt4 key购买 nike

场景是这样的:

我有一个应用程序 (main.exe),它使用 dlopen() 动态加载库 libA.so。 libA.so 依赖于另一个库 libB.so。

现在 libB.so 有一个构造函数,它生成一个线程(处于分离状态)并在从命名管道读取数据时阻塞。

当使用 dlclose() 卸载 libA.so 时,线程会发生什么情况 -(我假设这也会卸载 libB.so)?

我在 dlclose(libA.so) 之后在线程中遇到段错误。

伪代码:

main.c (main.exe):

handle = dlopen(libA.so)
// function calls
dlclose(handle)

libA.so 依赖于 libB.so

b.c(libB.so):

__attribute_constructor__void start() {
pthread_create(ThreadFunction)

void ThreadFunction() {
while(1) {
fd = open("path_to_pipe", READONLY)
read(fd, buffer, size)
//Process the content
}

最佳答案

卸载仍在使用的共享库是未定义的行为。在句柄上调用 dlclose() 是声明仍然需要通过该句柄提供的函数和数据对象。

dlclose() 无法验证这一事实。如果您仍然有一个指向可加载模块中的函数或数据对象的指针,那么这些指针将变得无效并且可能无法使用。如果在任何线程的调用堆栈上有一个指向加载函数的指针——如果线程正在等待文件描述符,就会出现这种情况——那么该线程可能不会返回到该调用帧。 (如果可以在不引用已卸载模块的情况下展开堆栈,则到先前帧的 Longjmp 可能会起作用。这可能在 C 中有效,但抛出 C++ 异常以从已卸载函数中逃逸可能会失败。

关于multithreading - dlclose 时共享库产生的线程会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51146196/

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