Concurrence avec les threads
Avancéuse std::sync::{Arc, Mutex, mpsc};
use std::thread;
let compteur = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..8 {
let c = Arc::clone(&compteur);
handles.push(thread::spawn(move || {
*c.lock().unwrap() += 1;
}));
}
for h in handles { h.join().unwrap(); }
// Canal entre threads
let (tx, rx) = mpsc::channel();
thread::spawn(move || tx.send("salut").unwrap());
println!("{}", rx.recv().unwrap());
Les traits Send (transférable entre threads) et Sync (partageable par référence entre threads) sont vérifiés à la compilation : un Rc ne compilera pas dans un thread::spawn.
// Threads "scopés" : peuvent emprunter des données locales (pas besoin de 'static)
let mut donnees = vec![1, 2, 3];
thread::scope(|s| {
s.spawn(|| println!("{donnees:?}"));
});
Parallélisme de données avec rayon#
use rayon::prelude::*;
let somme: u64 = (1..=1_000_000u64).into_par_iter().map(|n| n * n).sum();
// il suffit de remplacer .iter() par .par_iter() pour paralléliser