Rust:在动态加载的库内和外强制执行生命周期

问题描述

我正在探索使用 Rust 动态加载库,并希望获得正确的生命周期。

我基本上遵循 https://michael-f-bryan.github.io/rust-ffi-guide/dynamic_loading.html 进行一般设置,但是似乎该站点上的 Plugin 特征正在从动态加载的插件中创建具有 'static 生命周期的引用,考虑到插件在运行时加载和卸载我有点困惑这怎么可能是正确的。

链接页面复制(并缩短)的示例:

pub trait Plugin: Any + Send + Sync {
    fn name(&self) -> &'static str;
    ...
}

随着库在运行时被卸载,fn name(&self) 的返回值和 Any 超特征的生命周期对我来说听起来像是在撒谎,至少如果我正确理解卸载库将从 RAM 中删除其所有“静态”符号,从而使字符串、类型 ID 等指向无效内存...

链接站点甚至明确提到加载的库需要比从它们创建的 Plugin trait 对象在内存中停留的时间更长,但代码似乎没有以任何方式强制执行这一点。

解决这个问题的幼稚想法是删除 Any trait(我不需要它),将所有输出引用与 self 的生命周期联系起来,并注释生命周期从库中创建 trait 对象的函数的返回类型中的 trait 对象。

pub trait Plugin: Send {
    fn name<'p>(&'p self) -> &'p str;
    ...
}

pub fn load_plugin_from_library<'p>(&'p library : Library) -> Box<dyn Plugin + 'p> {
    ...
}

我认为这将确保在调用端我不会在库超出范围后意外调用任何插件方法,但是我刚刚意识到没有什么可以阻止实现者即使在删除 Plugin 特征对象后,插件也会意外引用库。

例如,fn name(&self) 可以在内部生成一个新线程并将其分离。该线程仍然可以依赖库的符号,如果在我卸载库时它仍在运行,一切都会崩溃。

现在我的实际问题是,如果我能以某种方式防止这种情况,除了将特征标记为不安全以确保实现者实际阅读文档以确保他们产生的所有线程在从 Plugin方法

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...