Created
December 28, 2015 01:24
-
-
Save fero23/3114174d2fad037fd97a to your computer and use it in GitHub Desktop.
Rust concurrency test
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::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