Rust 解构枚举受 std::sync::RwLock 保护,返回引用

问题描述 投票:0回答:1

我有一个枚举元素向量,我想以线程安全的方式访问。 我有一些接口需要将枚举值降级为一个选项,以免将内部结构暴露给公共 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中找到对应的功能。为此可以使用什么?

asynchronous rust enums rwlock
1个回答
0
投票

这样做当然是安全的,毕竟 Rust 保证如果你不使用

unsafe
它是内存和线程安全的。但它肯定不会做你想要的事情,因为
get_mut
要求你只有一个对
RwLock
的引用,但在这种情况下,你可以完全放弃
RwLock
并获得相同的效果。

© www.soinside.com 2019 - 2024. All rights reserved.