ich die Portierung meiner C++ Schach-Engine in Rust. Ich habe eine große Hash-Tabelle zwischen Such-Threads geteilt und in der C++ - Version ist diese Tabelle gesperrt; Es gibt keinen Mutex für das Teilen des Lese-/Schreibzugriffs. Hier ist the theory, wenn Sie interessiert sind.Teilen Lock-weniger Ressourcen zwischen Threads in Rust
Im Rust Version dieses Codes ist es gut funktioniert, nutzt aber ein 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();
}
Wie kann ich den Tisch zwischen Threads ohne Mutex teilen?
Ich bin nicht sicher, dass es eine angemessene Antwort darauf gibt. Wenn eine Datenstruktur nicht gesperrt werden muss, benötigen Sie keinen Mutex. Wenn dies der Fall ist, brauchen Sie * einen * Mutex, und der Versuch, die Verwendung eines solchen zu vermeiden, ist unsicher. Ich weiß nicht, ob es eine bereits existierende, anwendbare Lösung gibt, weil Sie nicht angegeben haben, was Sie versuchen, außer "kein Mutex". Und wenn nicht, dann geht das in "empfehlen Sie eine Bibliothek" (die möglicherweise geschlossen wird, um zu breit zu sein), oder "wie schreibe ich eine lock-free Datenstruktur" (die * auch * wahrscheinlich zu breit ist) . –
Auch durch diesen Link Spiegeln (ich habe keine Zeit, einen ganzen Artikel zu lesen, eine etwas vage Frage zu versuchen und zu beantworten), frage ich mich, warum Sie nicht nur 'Handy' verwenden können. Aber ich weiß nicht, was 'new_hash()' tut, also \ * shrug \ * –
Wie Matthieu M. antwortet, müssen Sie Ihre Datenstruktur implementieren 'Sync' implementieren, was anzeigt, dass sie sicher zwischen Threads geteilt werden kann. Das ändert das Problem auf Ihre eigentliche Frage: "Wie schreibe ich diese ** besondere ** blocklose Datenstruktur in Rust?". Um das zu tun, werden Sie * wahrscheinlich * unsicheren Code schreiben müssen. Es scheint, dass die fragliche Hashtabelle bestimmte ** Hardware ** -Voraussetzungen erfordert (z. B. 64-Bit-Speicher im Speicher sind natürlich atomar) und ** Software ** -Voraussetzungen (z. B. speichern Sie zwei 64-Bit-Werte). Das scheint anzuzeigen, dass die Datenstruktur nicht tragbar ist. – Shepmaster