Ich möchte einen Wert von einer Funktion, die durch eine Mutex
geschützt ist, aber nicht verstehen, wie man es richtig macht. Dieser Code funktioniert nicht:So übernehmen Sie den Besitz von T von Arc <Mutex<T>>?
use std::sync::{Arc, Mutex};
fn func() -> Result<(), String> {
let result_my = Arc::new(Mutex::new(Ok(())));
let result_his = result_my.clone();
let t = std::thread::spawn(move || {
let mut result = result_his.lock().unwrap();
*result = Err("something failed".to_string());
});
t.join().expect("Unable to join thread");
let guard = result_my.lock().unwrap();
*guard
}
fn main() {
println!("func() -> {:?}", func());
}
Der Compiler beschwert sich:
error[E0507]: cannot move out of borrowed content
--> src/main.rs:16:5
|
16 | *guard
| ^^^^^^ cannot move out of borrowed content
Was würden Sie wie das Verhalten von 'result_his.lock()' sein, nachdem der Wert von 'result_my' bewegen? – Shepmaster
Idealerweise würde ich gerne etwas akzeptieren, das 'Mutex' wertmäßig akzeptiert und' T' ergibt, bisher brauche ich diesen Mutex nicht mehr. Aber ok, ich verstehe jetzt, das könnte eine zu komplexe Lösung sein. Soll ich jetzt die Antwort von @SBSTP akzeptieren oder ist es besser, meine eigene Antwort zu geben und sie zu akzeptieren? –
swizard