Ich versuche in Rust mit dem Multithreading herumzuspielen und bin auf etwas gestoßen, das ich eher trivial finde. Hier ist der Code-Schnipsel:Warum kann ich es nicht versuchen! Mutex.lock?
use std::thread;
use std::sync::{Arc, Mutex};
fn main() {
let vec: Vec<i32> = vec!(1, 2, 3);
let shared = Arc::new(Mutex::new(vec));
let clone = shared.clone();
let join_handle = thread::spawn(move || {
let mut data = clone.lock().unwrap();
data.push(5);
});
join_handle.join().unwrap();
let clone = shared.clone();
let vec = try!(clone.lock());
println!("{:?}", *vec);
}
Also, meine Frage ist auf der Linie let vec = try!(clone.lock())
. Dies verursacht den folgenden Compiler-Fehler:
error: mismatched types [E0308]
return $ crate :: result :: Result :: Err (
^
note: in this expansion of try! (defined in <std macros>)
help: run `rustc --explain E0308` to see a detailed explanation
note: expected type `()`
note: found type `std::result::Result<_, _>`
Für mich macht dies nicht viel Sinn. clone.lock()
gibt TryLockResult<MutexGuard<T>>
zurück, was im Wesentlichen in Result<MutexGuard<T>, PoisonedError<MutexGuard<T>>
übersetzt wird, was bedeutet, dass try!(clone.lock())
entweder zu einem Wurf oder MutexGuard<T>
aufgelöst werden sollte.
Verstehe ich hier etwas grundsätzlich falsch?