我有一个枚举元素向量,我想以线程安全的方式访问。 我有一些接口需要将枚举值降级为一个选项,以免将内部结构暴露给公共 API。 为此,我将每个向量元素封装在一个
RwLock
: 中
enum Container<T>{
Empty, Emptied, Full(T)
}
use std::sync::{RwLock, RwLockReadGuard};
struct Ship<T>{
content: Vec<RwLock<Container<T>>>
}
impl<T> Ship<T>{
pub fn get_enum(&self, index: usize) -> Option<RwLockReadGuard<'_, Container<T>>>{
self.content[index].read().ok()
}
// The below code fails to compile:
// pub fn get(&self, index: usize) -> Option<&T>{
// match self.content[index].borrow().ok().unwrap() {
// Container::Full(c) => Some(c),
// _=> None
// }
// }
pub fn get_mut(&mut self, index: usize) -> Option<&mut T>{
match self.content[index].get_mut().ok().unwrap() {
Container::Full(c) => Some(c),
_=> None
}
}
}
上面的代码似乎可以编译,但是运行起来安全吗? 我也想提供一个只读访问的接口,但是我没能在API中找到对应的功能。为此可以使用什么?
这样做当然是安全的,毕竟 Rust 保证如果你不使用
unsafe
它是内存和线程安全的。但它肯定不会做你想要的事情,因为 get_mut
要求你只有一个对 RwLock
的引用,但在这种情况下,你可以完全放弃 RwLock
并获得相同的效果。