From 0d30968d3e06d0885ad494d708466955d534eab7 Mon Sep 17 00:00:00 2001 From: jazzpi Date: Fri, 16 Dec 2022 11:07:36 +0100 Subject: [PATCH] Multithread it --- src/bin/d15p2.rs | 43 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/src/bin/d15p2.rs b/src/bin/d15p2.rs index 7ded310..b46ba5b 100644 --- a/src/bin/d15p2.rs +++ b/src/bin/d15p2.rs @@ -1,12 +1,44 @@ +use std::{ + sync::{Arc, Mutex}, + thread, +}; + use aoc22::{day15, util}; use itertools::Itertools; const COORD_MAX: isize = 4000000; +const NUM_THREADS: usize = 16; pub fn main() { - let sensors = day15::parse_sensors(&util::parse_input()); + let sensors = Arc::new(day15::parse_sensors(&util::parse_input())); + + let mut handles = vec![]; + let next_row = Arc::new(Mutex::new(0)); + + for _ in 0..NUM_THREADS { + let sensors = sensors.clone(); + let next_row = next_row.clone(); + let handle = thread::spawn(move || find_possible(&sensors, next_row)); + handles.push(handle); + } + + for handle in handles { + handle.join().unwrap(); + } +} + +pub fn find_possible(sensors: &Vec, next_row: Arc>) { + loop { + let row = { + let mut handle = next_row.lock().unwrap(); + let result = *handle; + if result > COORD_MAX { + return; + } + *handle += 1; + result + }; - for row in 0..=COORD_MAX { let covered = sensors .iter() .map(|s| s.covered(row)) @@ -25,7 +57,12 @@ pub fn main() { x * 4000000 + row ) } else if max_x != isize::MIN && min > max_x + 2 { - panic!("More than one coordinate free: {}..{}", max_x + 1, min - 1); + panic!( + "More than one coordinate free in row {}: {}..{}", + row, + max_x + 1, + min - 1 + ); } max_x = max_x.max(max); }