问题描述
免责声明:这个问题与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 (将#修改为@)