マップとリストの2つのコレクションで参照を共有しようとしています。私は両方のコレクションにプッシュし、リストの後ろから削除して、マップからも削除したいと思います。このコードは、私がやりたいことを提示する単なるサンプルであり、コンパイルさえしません!2つのコレクションで参照変数を共有
これを実装するための正しいパラダイムは何ですか?どのような保証がベストプラクティスですか?
use std::collections::{HashMap, LinkedList};
struct Data {
url: String,
access: u64,
}
struct Holder {
list: LinkedList<Box<Data>>,
map: HashMap<String, Box<Data>>,
}
impl Holder {
fn push(&mut self, d: Data) {
let boxed = Box::new(d);
self.list.push_back(boxed);
self.map.insert(d.url.to_owned(), boxed);
}
fn remove_last(&mut self) {
if let Some(v) = self.list.back() {
self.map.remove(&v.url);
}
self.list.pop_back();
}
}
'RefCell'の性能上の問題は、アイテムに' RWLock'があることがわかっているので、どうでしょうか?巨額のデータでそれほど悪くないのですか? –
@NavidNabavi意味的にはRWLockのように、多くの読者が許可されているが、ライターは1人だけです。しかし、ロックとは異なり、スレッド間で作業する必要はありません。したがって、変更可能な参照を取得することは、文字通り通常の非アトミックメモリアクセス(実際にアクセスできるように、アクセスするデータの近く)および条件付きジャンプです。これは安価ですが、唯一の潜在的な減速は、キャッシュを傷つける可能性のある追加のメモリを必要とするためです。しかし、それをベンチマークして自分自身で見てみませんか? – delnan