File tree 1 file changed +36
-0
lines changed
1 file changed +36
-0
lines changed Original file line number Diff line number Diff line change @@ -72,11 +72,47 @@ fn main() {
72
72
let start = Instant :: now ( ) ;
73
73
74
74
// TODO: call get_input_numbers() and store a queue of numbers to factor
75
+ let numbers = Arc :: new ( Mutex :: new ( get_input_numbers ( ) ) ) ;
75
76
76
77
// TODO: spawn `num_threads` threads, each of which pops numbers off the queue and calls
77
78
// 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
+ }
78
111
79
112
// TODO: join all the threads you created
113
+ for thread in threads. into_iter ( ) {
114
+ thread. join ( ) . unwrap ( ) ;
115
+ }
80
116
81
117
println ! ( "Total execution time: {:?}" , start. elapsed( ) ) ;
82
118
}
You can’t perform that action at this time.
0 commit comments