Rust threading: Difference between revisions
From wikinotes
No edit summary |
|||
Line 49: | Line 49: | ||
</blockquote><!-- Basics --> | </blockquote><!-- Basics --> | ||
== | == Synchronization == | ||
<blockquote> | <blockquote> | ||
== mspc::channel == | |||
<blockquote> | |||
multiple producer, single consumer, FIFO queue.<br> | |||
do work in threads, have eventloop in main thread. | |||
<syntaxhighlight lang="rust"> | <syntaxhighlight lang="rust"> | ||
use std::thread; | |||
use std::sync::mpsc; | |||
fn main() { | |||
let (tx, rx) = mpsc::channel(); | |||
let handle = thread::spawn(move|| { | |||
tx.send(123).unwrap(); | |||
}); | |||
println!("hello to {}", rx.recv().unwrap()); | |||
handle.join().expect("unable to join thread"); | |||
} | |||
</syntaxhighlight> | </syntaxhighlight> | ||
</blockquote><!-- | </blockquote><!-- mspc::channel --> | ||
</blockquote><!-- Synchronization --> |
Revision as of 04:04, 10 February 2023
Documentation
rust book: concurrency https://doc.rust-lang.org/stable/book/ch16-00-concurrency.html std::sync
builtin synchronization primitives
Basics
Since rust already manages ownership semantics, you don't really need to deal with thread affinity.
Simply pass a closure to a thread, move any params to it, and call it a day.thead without outer scope access
use std::thread; use std::time::Duration; fn main() { let handle = thread::spawn(|| { for i in 1..=5 { println!("step {}/5..", i); thread::sleep(Duration::from_secs(1)); } }); handle.join().expect("unable to join thread"); }thread that moves outer-scope into thread's closure
use std::thread; use std::time::Duration; fn main() { let name = String::from("alex"); let handle = thread::spawn(move || { for _ in 1..=5 { println!("hi {}!", name); thread::sleep(Duration::from_secs(1)); } }); handle.join().expect("unable to join thread"); }
Synchronization
mspc::channel
multiple producer, single consumer, FIFO queue.
do work in threads, have eventloop in main thread.use std::thread; use std::sync::mpsc; fn main() { let (tx, rx) = mpsc::channel(); let handle = thread::spawn(move|| { tx.send(123).unwrap(); }); println!("hello to {}", rx.recv().unwrap()); handle.join().expect("unable to join thread"); }