Skip to content

Instantly share code, notes, and snippets.

@fero23
Created December 28, 2015 01:24
Show Gist options
  • Save fero23/3114174d2fad037fd97a to your computer and use it in GitHub Desktop.
Save fero23/3114174d2fad037fd97a to your computer and use it in GitHub Desktop.
Rust concurrency test
use std::thread;
use std::sync::{Arc, Mutex};
fn main() {
const MAX_HAND: u32 = 5;
const PLAYERS: usize = 5;
let players: Arc<Mutex<Vec<u32>>> = Arc::new(Mutex::new(vec![0;PLAYERS]));
let dealer: Arc<Mutex<u32>> = Arc::new(Mutex::new(MAX_HAND));
println!("Start. Everyone has no card.\nPlayers: {:?}\nDealer: {:?}\n",
*players.lock().unwrap(), *dealer.lock().unwrap());
let handles: Vec<_> = (0..PLAYERS).into_iter().map(|n| {
let players = players.clone();
let dealer = dealer.clone();
thread::spawn(move || {
loop {
let mut players = players.lock().unwrap();
let mut dealer = dealer.lock().unwrap();
if *dealer == 0 {
println!("Reloading dealer's cards ...");
*dealer = MAX_HAND;
}
*dealer -= 1;
players[n] += 1;
println!("Player #{} has {} card(s)", n + 1, players[n]);
if players[n] == MAX_HAND {
break;
}
}
})
}).collect();
for h in handles {
h.join().unwrap();
}
println!("\nThe end. Everyone has 5 cards.\nPlayers: {:?}\nDealer: {:?}",
*players.lock().unwrap(), *dealer.lock().unwrap());
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment