如何解决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 举报,一经查实,本站将立刻删除。