-
-
Save RandyMcMillan/b30a888051b568c06d6ba4db6e773b2c to your computer and use it in GitHub Desktop.
threads_channel.rs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use std::sync::mpsc::{Sender, Receiver}; | |
use std::sync::mpsc; | |
use std::thread; | |
static NTHREADS: i32 = 3; | |
fn main() { | |
// Channels have two endpoints: the `Sender<T>` and the `Receiver<T>`, | |
// where `T` is the type of the message to be transferred | |
// (type annotation is superfluous) | |
let (tx, rx): (Sender<i32>, Receiver<i32>) = mpsc::channel(); | |
let mut children = Vec::new(); | |
for id in 0..NTHREADS { | |
// The sender endpoint can be copied | |
let thread_tx = tx.clone(); | |
// Each thread will send its id via the channel | |
let child = thread::spawn(move || { | |
// The thread takes ownership over `thread_tx` | |
// Each thread queues a message in the channel | |
thread_tx.send(id).unwrap(); | |
// Sending is a non-blocking operation, the thread will continue | |
// immediately after sending its message | |
println!("thread {} finished", id); | |
}); | |
children.push(child); | |
} | |
// Here, all the messages are collected | |
let mut ids = Vec::with_capacity(NTHREADS as usize); | |
for _ in 0..NTHREADS { | |
// The `recv` method picks a message from the channel | |
// `recv` will block the current thread if there are no messages available | |
ids.push(rx.recv()); | |
} | |
// Wait for the threads to complete any remaining work | |
for child in children { | |
child.join().expect("oops! the child thread panicked"); | |
} | |
// Show the order in which the messages were sent | |
println!("{:?}", ids); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment