From f0583c35cf3d8dcc55b2b7314061abd767c19f60 Mon Sep 17 00:00:00 2001 From: Rene Luria Date: Thu, 5 May 2022 21:57:02 +0200 Subject: [PATCH] use mutex for stats instead of yield at the end --- src/population.rs | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/src/population.rs b/src/population.rs index faef2be..490632a 100644 --- a/src/population.rs +++ b/src/population.rs @@ -1,5 +1,6 @@ use std::sync::Arc; +use std::sync::Mutex; use std::thread; use crate::prelude::*; @@ -78,7 +79,7 @@ impl Population { let len = humans.len(); let mut humans_n_plus_1: Vec = Vec::with_capacity(len); - let mut stats: [i32; 4] = [0, 0, 0, 0]; + let stats: [i32; 4] = [0, 0, 0, 0]; let num_threads = num_threads.unwrap_or(1); if num_threads > 48 { @@ -93,6 +94,8 @@ impl Population { let mut threads = vec![]; + let stats_arc = Arc::new(Mutex::new(stats)); + for x in 0..num_threads { // find items to process @@ -104,6 +107,7 @@ impl Population { // borrow copies of data for thread let humans = Arc::clone(&self.humans); + let stats = Arc::clone(&stats_arc); let (width, height, infection_rate, curing_rate, death_rate) = (self.width, self.height, self.plague.infection_rate, self.plague.curing_rate, self.plague.death_rate); @@ -112,7 +116,6 @@ impl Population { // no write on data // let humans = humans; let mut humans_n_plus_1: Vec = Vec::with_capacity(num_items); - let mut stats: [i32; 4] = [0, 0, 0, 0]; for idx in lower_bound..upper_bound { let human = &humans[idx]; @@ -120,7 +123,6 @@ impl Population { let mut new_human = human.clone(); match human.present_state { State::Normal => { - stats[0] += 1; let possible = [ (human.x - 1, human.y - 1), (human.x, human.y - 1), (human.x + 1, human.y - 1), (human.x - 1, human.y) , (human.x + 1, human.y), @@ -138,32 +140,43 @@ impl Population { None => {} } } + let mut stats = stats.lock().unwrap(); + stats[0] += 1; } State::Infected => { - stats[1] += 1; match die_or_cure(curing_rate, death_rate) { Some(x) => new_human.present_state = x, None => {} } + let mut stats = stats.lock().unwrap(); + stats[1] += 1; + } + State::Immune => { + let mut stats = stats.lock().unwrap(); + stats[2] += 1; + } + State::Dead => { + let mut stats = stats.lock().unwrap(); + stats[3] += 1; } - State::Immune => { stats[2] += 1; } - State::Dead => { stats[3] += 1; } } humans_n_plus_1.push(new_human); } - (humans_n_plus_1, stats) + (humans_n_plus_1,) })); } for t in threads { let mut res = t.join().unwrap(); humans_n_plus_1.append(&mut res.0); - for x in 0..4 { - stats[x] += res.1[x]; - } + // for x in 0..4 { + // stats[x] += res.1[x]; + // } } self.humans = Arc::new(humans_n_plus_1); + let stats = Arc::clone(&stats_arc); + let stats = *stats.lock().unwrap(); stats } } @@ -186,7 +199,7 @@ fn point_to_index(x: i32, y: i32, width: i32, height: i32) -> Option { } } -pub fn roll(probability: i32) -> bool { +fn roll(probability: i32) -> bool { if probability > 0 { let mut rng = rand::thread_rng(); rng.gen_range(0..CORRECTED_PERCENTAGE) <= probability