rust - 这是 !Sync 类型声音的包装器吗?

标签 rust

我有时发现自己使用 !Sync 类型(例如 bumpalo::Bump )作为我希望成为 Sync 的类型实现的一部分。现在我对外部类型使用 unsafe impl Sync 来完成它,并且只在 &mut self 方法中接触内部类型。但是用像下面这样的包装器封装不安全是否合理?特别是 Send 边界是否正确?

pub struct UnCell<T> {
    value: T
}

unsafe impl<T> Sync for UnCell<T> {}

impl<T> UnCell<T> {
    pub fn new(value: T) -> Self {
        Self { value }
    }
    pub fn into_inner(self) -> T {
        self.value
    }
    pub fn get(&mut self) -> &T {
        &self.value
    }
}
impl<T: Send> UnCell<T> {
    pub fn get_mut(&mut self) -> &mut T {
        &mut self.value
    }
}

最佳答案

不仅听起来不错,还有一个待定的 PR 可以添加一个类型,Exclusive,这将使您能够安全地做到这一点!

[core] add Exclusive to sync - #97629 .

您甚至不需要 Send 绑定(bind):对于 Send 的可变引用,its referent should also be - 因此,如果您在某个线程上有一个可变引用,您可以安全地访问引用对象。

关于rust - 这是 !Sync 类型声音的包装器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72545085/

相关文章:

rust - 有效地检查 vec 中的每个项目与其他项目并进行变异

types - 从函数返回泛型而在rust中没有泛型参数

rust - 在 Rust 中,Clone 是在堆上复制,而 Copy 是在堆栈上复制吗?

rust - 如何获取 `&str`之间的字节偏移量

mysql - 使用 mysql crate 时如何将 MySQL 枚举转换为 Rust 枚举?

rust - rustc 生成的 LLVM 在使用 lli 运​​行时会给出有关 main 参数类型的错误

rust - 了解 rust `Rc<RefCell<_>>`

rust - 如何使 cargo 保存分析?

rust - 借用 Rust 中的检查器和函数参数,正确还是过于热心?

recursion - Rust 会公开调用堆栈深度吗?