我有时发现自己使用!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
的可变引用,其引用也应该是-因此,如果您在某个线程上有可变引用,则可以安全地访问引用。