0

免责声明:这个问题非常接近将两个对象传递给线程,其中一个对象持有另一个对象的引用,但不相等。

我有一个 C 库,我调用它来获取指向结构的指针,然后*mut ffi_context返回。然后我将该指针包装成这样的 rust 结构:

pub struct MyContext {
  raw_context: *mut ffi_context
}

并实现一个合适的Drop方法来释放*mut ffi_context.

然后我可以使用该上下文来获取更多的结构(*mut ffi_context_dependant),这些结构不能超过上下文。我查阅了 nomicon,并在我的 MyContextDependant 结构中添加了一个 PhantomData,所以如果我违反了生命周期要求,rustc 会对我大喊:

pub struct MyContextDependant<'ctx> {
  raw_context: *mut ffi_context_dependant,
  _phantom: PhantomData<&'ctx MyContext>
}

现在我希望类型为Send-y。C 库声明可以使用来自另一个线程的结构,但不能同时使用。这很好,因为这意味着我可以Send为这些结构实现:

  • 只要没有 &mut (并行阅读不会造成伤害),我就可以将 &s 传递给任何人(假设生命周期成立)
  • 我可以将 &mut 传递给一个,当且仅当没有 &s 被持有
  • 除非我证明上下文存在足够长的时间,否则我不能将依赖项移动到线程

但是,它禁止我移动上下文和所有依赖项,这将(实际上)是完全安全的,只要我强制移动的目的地使上下文超过所有依赖项。

有没有一种理智的方法可以用 rust 来表达这一点?我是否必须编写(不安全的)辅助函数来解构我的 rust 类型、移动原始指针并重建具有适当生命周期的 rust 类型?

4

0 回答 0