大きなObj
タイプのグローバルオブジェクトプールを実装しようとしています。ここでPOOL
のためのコードは次のとおりです。ここでなぜMutexのロックを解除しないのですか?
static mut POOL: Option<Mutex<Vec<Obj>>> = None;
static INIT: Once = ONCE_INIT;
pub struct Obj;
は、私がアクセスしPOOL
をロックしています方法です:
fn get_pool<'a>() -> MutexGuard<'a, Vec<Obj>> {
unsafe {
match POOL {
Some(ref mutex) => mutex.lock().unwrap(),
None => {
INIT.call_once(|| {
POOL = Some(Mutex::new(vec![]));
});
get_pool()
}
}
}
}
これが問題を引き起こしているコードです:
impl Drop for Obj {
fn drop(&mut self) {
println!("dropping.");
println!("hangs here...");
get_pool().push(Obj {});
}
}
impl Obj {
pub fn new() -> Obj {
println!("initializing");
get_pool().pop().unwrap_or(Obj {})
// for some reason, the mutex does not get unlocked at this point...
}
}
私はそれを考えます戻り値get_pool
のMutexGuard
の寿命'a
と関係があります。率直に言って、これらの生涯パラメータの仕組みについては、おそらくちょっと混乱しています。
ここには、実施例のあるlink to a playgroundがあります。あなたの助けとメリークリスマスをありがとう。問題は、このラインに位置する
ありがとうございました!それは、このバージョンとそれがベースにしている複雑なリアルバージョンの両方で私の問題を解決しました。あなたがそれを理解するために使用したプロセスを説明しようとする可能性はありますか? – ethanabrooks
私はあなたの単純化された例がなければこれを解決できませんでした!さて、私は明日のプロセスについていくつかの詳細を追加します。 – wimh