einen Kanal verwenden, die ()
sendet Typ ist wahrscheinlich am einfachsten:
use std::sync::mpsc::channel;
use std::thread;
let (tx,rx) = channel();
// Spawn your worker thread, giving it `send` and whatever else it needs
thread::spawn(move|| {
// Do whatever
tx.send(()).expect("Could not send signal on channel.");
// Continue
});
// Do whatever
rx.recv().expect("Could not receive from channel.");
// Continue working
Der ()
Typ ist, weil es effektiv Null-Information ist, die es ist ziemlich klar bedeutet, Sie verwenden sie nur als ein Signal. Die Tatsache, dass sie die Größe Null hat, bedeutet, dass sie in einigen Szenarien möglicherweise auch schneller ist (aber realistischerweise wahrscheinlich nicht schneller als ein normaler Maschinenwortschreibvorgang).
Wenn Sie nur das Programm benachrichtigen müssen, dass ein Thread fertig ist, können Sie seinen Join Guard holen und darauf warten, dass er sich anschließt.
let guard = thread::spawn(...); // This will automatically join when finished computing
guard.join().expect("Could not join thread");
Beachten Sie, dass die Verwendung von 'wait()/notify()' ohne eine 'while' -Schleife auf einem gemeinsamen Flag eine schlechte Idee ist -' wait() 'kann nicht mehr warten, ohne dass' notify() 'aufgerufen wird als ein unechter Weckruf. Die Verwendung von spezialisierten Grundelementen wie "CountDownLatch" oder "Exchanger" wäre viel besser; es wäre den Kanälen in Rust in den Antworten unten sehr ähnlich. –