Multithread it

This commit is contained in:
jazzpi 2022-12-16 11:07:36 +01:00
parent 62e9d17eff
commit 0d30968d3e
1 changed files with 40 additions and 3 deletions

View File

@ -1,12 +1,44 @@
use std::{
sync::{Arc, Mutex},
thread,
};
use aoc22::{day15, util}; use aoc22::{day15, util};
use itertools::Itertools; use itertools::Itertools;
const COORD_MAX: isize = 4000000; const COORD_MAX: isize = 4000000;
const NUM_THREADS: usize = 16;
pub fn main() { 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<day15::Sensor>, next_row: Arc<Mutex<isize>>) {
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 let covered = sensors
.iter() .iter()
.map(|s| s.covered(row)) .map(|s| s.covered(row))
@ -25,7 +57,12 @@ pub fn main() {
x * 4000000 + row x * 4000000 + row
) )
} else if max_x != isize::MIN && min > max_x + 2 { } 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); max_x = max_x.max(max);
} }