Skip to content

Commit b704a1b

Browse files
committed
Week5 completed.
1 parent 65ffd9f commit b704a1b

File tree

1 file changed

+36
-0
lines changed

1 file changed

+36
-0
lines changed

week5/farm/src/main.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,47 @@ fn main() {
7272
let start = Instant::now();
7373

7474
// TODO: call get_input_numbers() and store a queue of numbers to factor
75+
let numbers = Arc::new(Mutex::new(get_input_numbers()));
7576

7677
// TODO: spawn `num_threads` threads, each of which pops numbers off the queue and calls
7778
// factor_number() until the queue is empty
79+
let mut threads = Vec::new();
80+
for i in 0..num_threads {
81+
let numbers_copy = Arc::clone(&numbers);
82+
threads.push(thread::spawn(move || {
83+
/* wrong1: it is serial!
84+
while let Some(number) = numbers_copy.lock().unwrap().pop_front() {
85+
print!("[{}] ", i);
86+
factor_number(number);
87+
}
88+
*/
89+
/* wrong2: it is serial!
90+
loop {
91+
if let Some(number) = numbers_copy.lock().unwrap().pop_front() {
92+
print!("[thread {}] ", i);
93+
factor_number(number);
94+
} else {
95+
break;
96+
}
97+
}
98+
*/
99+
loop {
100+
let mut numbers = numbers_copy.lock().unwrap();
101+
if let Some(number) = numbers.pop_back() {
102+
drop(numbers);
103+
print!("[{}] ", i);
104+
factor_number(number);
105+
} else {
106+
break;
107+
}
108+
}
109+
}));
110+
}
78111

79112
// TODO: join all the threads you created
113+
for thread in threads.into_iter() {
114+
thread.join().unwrap();
115+
}
80116

81117
println!("Total execution time: {:?}", start.elapsed());
82118
}

0 commit comments

Comments
 (0)