微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将两个对象传递到线程中

如何解决将两个对象传递到线程中

免责声明:这个问题与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 举报,一经查实,本站将立刻删除。