我有时发现自己使用 !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/