私はRustのC++チェスエンジンを移植しています。私は検索スレッド間で共有される大きなハッシュテーブルを持っており、このテーブルはC++バージョンではロックレスです。読み取り/書き込みアクセスを共有するためのmutexはありません。ご興味のある方はthe theoryです。Rustのスレッド間でロックレスリソースを共有する
このコードの錆のバージョンでは、それが正常に動作しているが、Mutex
を使用しています。
let shared_hash = Arc::new(Mutex::new(new_hash()));
for _ in 0..n_cpu {
println!("start thread");
let my_hash = shared_hash.clone();
thread_pool.push(thread::spawn(move || {
let mut my_hash = my_hash.lock().unwrap();
let mut search_engine = SearchEngine::new();
search_engine.search(&mut myhash);
}));
}
for i in thread_pool {
let _ = i.join();
}
どのように私はミューテックスなしでスレッド間のテーブルを共有するだろうか?
これに適切な答えがあるかどうかはわかりません。データ構造がロックを必要としない場合は、ミューテックスは必要ありません。もしそうなら、あなたはミューテックスを必要とし、その使用を避けようとするのは危険です。 「ミューテックスなし」以外で何をしようとしているのかを指定していないため、既存の適用可能なソリューションがあるかどうかはわかりません。もしそうでなければ、これは "あまりにも広いために閉じられるかもしれない" "ライブラリを推薦する"か、 "どのようにロックフリーのデータ構造を書くのか"(これも*おそらく広すぎる) 。 –
また、そのリンクをめくってみると(記事全体を読んで少し漠然とした質問に答える時間がない)、なぜあなたは 'Cell'を使うことができないのだろうと思います。しかし、私は 'new_hash()'が何をしているのか分からないので、\ * shrug \ * –
Matthieu M.が答えているように、データ構造がスレッド間で安全に共有できることを示す 'Sync'を実装する必要があります。これは問題をあなたの本物の質問に変えます:「私はこの** **ロックレスなデータ構造をRustでどうやって書くのですか?」そのためには、安全でないコードを記述する必要があります。問題のハッシュテーブルには、**ハードウェア**の前提条件(たとえば、メモリへの64ビットストアは自然なアトミック)と**ソフトウェア**前提条件(たとえば、2つの64ビット値の保存)が必要です。これはデータ構造が移植性がないことを示しているようです。 – Shepmaster