我有一个类型为
Arc<RwLock<SessionData>>
我有一个方法,应该接收某种对SessionData
的引用。
fn some_method(session: ...)
我正在使用Rust的Web框架Rocket,由于该框架调用方法,我不能直接调用。不过,我可以提供一个实现来创建一个对象,并将其传递给处理程序。代码类似于:
impl<'a, 'r> request::FromRequest<'a, 'r> for SomeType {
type Error = ();
fn from_request(request: &'a request::Request<'r>) -> request::Outcome<Self, Self::Error> {
// return object here
}
}
我希望避免直接返回一个
RwLock
,因为我希望处理程序传递已经锁定的对象。但是,我不能返回引用或RwLockReadGuard
,因为它们都依赖于RwLock
,而RwLock
会超出范围。相反,我正在尝试创建一种自给自足的类型,该类型将包含
Arc<RwLock<SessionData>>
,包含对此锁的锁定保护以及解除对SessionData
对象的引用。到目前为止,我尝试了以下组合:
- 包含
Arc<RwLock<SessionData>>
和RwLockReadGuard<SessionData>
的Session
对象
- 包含Arc<RwLock<SessionData>>
和来自owning-ref库的RwLockReadGuardRef<SessionData>
的对象。
- 将使用owning-ref库中的OwnedHandle
类型的对象。然而,我无法实现想要做的事情,遇到了各种生命周期借用问题等问题。
是否有可能创建一种类似于
Handle
的自包含对象,该对象包含指向其所指向的对象的锁和锁定保护?这是与How to return reference to a sub-value of a value that is under a mutex?描述的情况类似但略有不同。在那里,
MutexGuardRef
内部依赖于Mutex
,如果Mutex
(或MyStruct
)超出范围,则无法存在。为了实现类似的行为,我必须传递一个包含我的RwLock
的结构,然后在方法内进行锁定。这很好,但我想知道是否可以再进一步,传递既是独立的又作为RwLockGuard
的结构,避免手动锁定的需要。基本上,我想将
RwLock
的锁定从客户端移动到值的提供者。