如何解决将两个对象传递到线程中
免责声明:这个问题与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 举报,一经查实,本站将立刻删除。