5

タイプのオブジェクトがあります

Arc<RwLock<SessionData>>

そして、私はある種の参照を取ることになっているメソッドを持っていますSessionData

fn some_method(session: ...)

Rocket (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

Arc<RwLock<SessionData>>代わりに、 を含み、このロックへのロック ガードを含み、オブジェクトへの参照解除を行う、ある種の自己完結型を作成しようとしていSessionDataます。

これまでのところ、次のいくつかの組み合わせを試しました。

  • とを含むSessionオブジェクトArc<RwLock<SessionData>>RwLockReadGuard<SessionData>
  • owning-refライブラリのArc<RwLock<SessionData>>およびを含むオブジェクト。RwLockReadGuardRef<SessionData>
  • owning-refライブラリのOwnedHandle型を使用するオブジェクト。

しかし、やりたいことができておらず、いろいろな一生の借金問題などにぶつかっています。

それが指しているオブジェクトへのロックとロックガードの両方を含む一種の自己完結型の「ハンドル」のようなオブジェクトを作成することはまったく可能ですか?

これは似ていますが、ミューテックスの下にある値のサブ値への参照を返す方法で説明されている状況とは少し異なります。. そこでは、 はMutexGuardRef内部的に に依存しており、 (または) が範囲外になるMutexと存在できません。同様の動作を実現するには、my を含む構造体を渡してから、メソッド内でロックを行う必要があります。これで問題ありませんが、さらに一歩進んで、独立していて として機能する構造体を渡して、手動でロックする必要がなくなるかどうか疑問に思っています。MutexMyStructRwLockRwLockGuard

RwLock基本的に、のロックをクライアントから値のプロバイダーに移動したいと考えています。

4

2 に答える 2