gpt4 book ai didi

rust - 独立于方法返回 RWLockReadGuard

转载 作者:行者123 更新时间:2023-11-29 07:57:22 32 4
gpt4 key购买 nike

我有一个类型的对象

Arc<RwLock<SessionData>>

我有一个方法应该采用某种对 SessionData 的引用

fn some_method(session: ...)

我正在使用 Rocket(Rust 的网络框架),我无法直接调用该方法,因为它是由 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 ,这将超出范围。

相反,我正在尝试创建某种自给自足的类型,其中包含 Arc<RwLock<SessionData>> ,包含此锁的锁守卫,并取消对 SessionData 的引用对象。

到目前为止,我已经尝试了以下的一些组合:

  • A Session包含 Arc<RwLock<SessionData>> 的对象和一个 RwLockReadGuard<SessionData>
  • 包含 Arc<RwLock<SessionData>> 的对象和一个 RwLockReadGuardRef<SessionData>来自 owning-ref图书馆。
  • 将使用 OwnedHandle 的对象从 owning-ref 输入图书馆。

然而,我一直没能做我想做的事,遇到各种终身借贷问题等等。

是否有可能创建一种自包含的类似“句柄”的对象,该对象将同时包含锁和它指向的对象的锁守卫?

这与 How to return reference to a sub-value of a value that is under a mutex? 中描述的情况类似,但略有不同。 .在那里,MutexGuardRef内部取决于 Mutex , 如果 Mutex 则不存在(或 MyStruct )超出范围。为了实现类似的行为,我必须传递一个包含我的 RwLock 的结构。然后在方法内部进行锁定。这很好,但我想知道我是否可以更进一步,传递一个既独立又作为 RwLockGuard 的结构。 ,避免了手动锁定的需要。

基本上,我想移动 RwLock 的锁定从客户到值(value)提供者。

最佳答案

Why can't I store a value and a reference to that value in the same struct? 中所述, Rental crate在某些情况下允许自引用结构。

#[macro_use]
extern crate rental;

use std::sync::{Arc, RwLock};

struct SessionData;
impl SessionData {
fn hello(&self) -> u8 { 42 }
}

rental! {
mod owning_lock {
use std::sync::{Arc, RwLock, RwLockReadGuard};

#[rental(deref_suffix)]
pub struct OwningReadGuard<T>
where
T: 'static,
{
lock: Arc<RwLock<T>>,
guard: RwLockReadGuard<'lock, T>,
}
}
}

use owning_lock::OwningReadGuard;

fn owning_lock(session: Arc<RwLock<SessionData>>) -> OwningReadGuard<SessionData> {
OwningReadGuard::new(session, |s| s.read().unwrap())
}

fn main() {
let session = Arc::new(RwLock::new(SessionData));

let lock = owning_lock(session.clone());
println!("{}", lock.hello());

assert!(session.try_read().is_ok());
assert!(session.try_write().is_err());

drop(lock);

assert!(session.try_write().is_ok());
}

另见:

关于rust - 独立于方法返回 RWLockReadGuard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50496879/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com