将两个对象传递到线程中

问题描述

免责声明:这个问题与Passing two objects,where one holds a reference to another,into a thread非常接近,但不相等。

我有一个C库,可以调用它来获得指向结构的指针,并返回*mut ffi_context。然后,我将该指针包装到一个这样的锈结构中:

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传递给任何人(假设终身保留)
  • 当且仅当不包含&s时,我才能将&mut传递给正好一个
  • 除非证明上下文寿命足够长,否则我不能将依赖项移至线程

但是,禁止我移动上下文和所有受抚养者,这(实际上)是完全安全的,只要我强制执行此举的目的地会使上下文超过所有受抚养者。

有没有一种通俗易懂的方式来表达这一点?我是否必须编写(不安全的)辅助函数来解构我的锈类型,移动原始指针并在适当的生命周期内重建锈类型?

解决方法

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

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

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