Threads
Move-Semantik und Threads
Abschnitt betitelt „Move-Semantik und Threads“use std::thread;fn main() { let mut n = 1; let t = thread::spawn(move || { n = n + 1; thread::spawn(move || { n = n + 1; }) }); n = n + 1; t.join().unwrap().join().unwrap(); println!("{n}");}Das Schlüsselwort move bewirkt, dass der Wert von n in die Closure verschoben wird. Daher haben die Zuweisungen n = n + 1 innerhalb von thread::spawn keine Auswirkung auf die äußere Variable n.
Thread-Lifetime und ‘static
Abschnitt betitelt „Thread-Lifetime und ‘static“Betrachten Sie dieses Beispiel aus dem Text, bei dem ein Vektor von einem Thread unsachgemäß erfasst wird:
use std::thread;
fn main() { let v = vec![1, 2, 3];
let handle = thread::spawn(|| { println!("Here's a vector: {:?}", v); });
handle.join().unwrap();}Der Rust-Compiler gibt diese Diagnose aus:
note: function requires argument type to outlive `'static` --> src/main.rs:6:18 |6 | let handle = thread::spawn(|| { | __________________^7 | | println!("Here's a vector: {:?}", v);8 | | }); | |______^Denken Sie daran, dass 'static die Lebensdauer von Referenzen ist, die für die gesamte Programmlaufzeit gültig sind.
Welche der folgenden Aussagen beschreibt die Anmerkung „function requires argument type to outlive 'static “ am besten?
Wenn eine Closure eine Referenz auf einen Wert erfasst, der kürzer als 'static lebt, ist es möglich, dass der Thread länger als der Wert lebt und die Speichersicherheit verletzt wird. Beachten Sie, dass thread::scope verwendet werden kann, um Threads das Erfassen von nicht-statischen Referenzen zu ermöglichen, indem die Lebensdauer des Threads statisch begrenzt wird.