这个包装纸是用来的吗!同步类型声音



我有时发现自己使用!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,它将允许您安全地执行此操作!

[核心]将Exclusive添加到同步-#97629。

您甚至不需要Send绑定:对于Send的可变引用,其引用也应该是-因此,如果您在某个线程上有可变引用,则可以安全地访问引用。

相关内容

最新更新