为指针包装器实现发送

问题描述

我试图准确地了解何时可以让类型实现 Send,而这在 Rust nomicon 中并不是很清楚。

具体来说,我有一个包含 Builder 的构建器结构(比如 Vec<*mut std::os::raw::c_char>):

pub struct Builder{
    list: Vec<*mut std::os::raw::c_char>,}

这些指针实际上来自一个解构的std::ffi::CString(通过使用std::ffi::CString::into_raw)。因此,这些指针实际上由构建器拥有(从某种意义上说,我手动实现了 DropBuilder 并重构了 std::ffi::CString 以释放内存),但由于 FFI 的要求,它们必须以这种方式存储。

这个构建器类型不是 copy 也不是 Clone,所以永远不会出现多个构建器认为他们拥有相同的字符指针的情况。这些指针也永远不会直接暴露在构建器的公共 API 中。

当然,由于指针是!SendVec的{​​{1}}也是!Send,所以!Send认是Builder。但是,在我看来,由于我的构建器在语义上维护指针的所有权,因此为 !Send 手动实现 Send 是安全的。我相信我所做的类似于手动实现 BuilderBox is Send if the thing inside the box is also Send,只是在我的情况下,“盒子”内的东西在逻辑上是一个切片 (Box,它是 [const std::os::raw::c_char]) 而不是原始指针(Send,即 *mut const std::os::raw::c_char)。

情况确实如此(我对 !Send 的理解是否正确),在为 Send 实现 Send 时还有什么我应该担心的吗?

解决方法

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

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

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