Title here
Summary here
We can use channels to synchronize execution across threads. Here’s an example of using a blocking receive to wait for a thread to finish. When waiting for multiple threads to finish, you may prefer to use a JoinHandle.
use std::thread;
use std::sync::mpsc;
use std::time::Duration;
// This is the function we'll run in a separate thread. The
// `tx` sender will be used to notify another thread that
// this function's work is done.
fn worker(tx: mpsc::Sender<bool>) {
print!("working...");
thread::sleep(Duration::from_secs(1));
println!("done");
// Send a value to notify that we're done.
tx.send(true).unwrap();
}
fn main() {
// Create a channel for communication
let (tx, rx) = mpsc::channel();
// Start a worker thread, giving it the sender to notify on.
thread::spawn(move || worker(tx));
// Block until we receive a notification from the
// worker on the channel.
rx.recv().unwrap();
}To run the program:
$ cargo run
working...doneIf you removed the rx.recv().unwrap(); line from this program, the program would exit before the worker even started.
In this Rust version:
std::thread for threading instead of goroutines.mpsc::channel() to create a channel for communication between threads.worker function takes a Sender instead of a channel.thread::spawn to start a new thread instead of using the go keyword.tx.send(true) to send a value on the channel, and rx.recv().unwrap() to receive it.This example demonstrates how to use channels for basic thread synchronization in Rust, which is conceptually similar to the original example.