</>
Plan du cours — 60/66

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