dlopen/dlclose执行环境

问题描述 投票:0回答:1

我有一个使用 dlopen/dlclose 的多线程 Linux 进程。静态对象的构造函数从 dlopen 内部调用,静态对象的析构函数从 dlclose 调用。

在这些情况下,线程环境如何?多个线程是否仍在运行,是否存在构造函数/析构函数与其他活动线程发生数据冲突的危险?

更新:

在这种情况下,我是一名库开发人员,我的问题是我可以从使用该库的应用程序中得到什么?我不希望在 doopen/dlclose 正在进行时直接调用有问题的库,但构造函数/析构函数可能会发生数据冲突。

另外,我的问题不是多次调用 dlopen/dlclose 。

假设我有一个类的静态实例,它使用互斥体来访问某些共享数据,我是否应该在从 dlclose 调用的析构函数中使用该互斥体作为清理的一部分?

c++ multithreading dlopen
1个回答
0
投票

是否存在构造函数/析构函数与其他活动线程发生数据冲突的危险?

是的:如果应用程序在线程 T1 中主动使用您的

dlopen
库并在另一个线程 T2 中调用
dlclose
,则
dlclose
可能会从 T1 的脚下猛拉地毯并导致其崩溃。

您应该告诉您的客户不要这样做。

我应该在 dlclose 调用的析构函数中使用这个互斥体作为清理的一部分吗?

不,这样做是没有意义的。

假设 T1 当前位于您的库中,但未访问共享数据。 T2 执行

dlclose
(获取或不获取互斥体),并卸载库。 T1 执行的下一条指令(仍在您的库中)将访问已卸载的代码,并将崩溃。您在析构函数中获取互斥锁并不能防止崩溃。

© www.soinside.com 2019 - 2024. All rights reserved.