スレッド自体はProducerとConsumerで同時に走ってるんだけど、なんか全然違うなぁ…
pub static SIZE: u32 = 5; static slot: Mutex<Vec<i32>> = Mutex::new(Vec::new()); fn work() { for i in 0..10 { let producer_handle = thread::spawn(move || { if slot.lock().unwrap().len() < SIZE.try_into().unwrap() { slot.lock().unwrap().push(1); println!("Producer {} work: {:?}", i, slot); thread::sleep(Duration::from_millis(500)); } else { for j in 0..5 { if slot.lock().unwrap()[j] == 0 { slot.lock().unwrap()[j] = 1; println!("Producer {} work: {:?}", i, slot); thread::sleep(Duration::from_millis(500)); } } } }); let consumer_handle = thread::spawn(move || { if slot.lock().unwrap().len() > 0 { if slot.lock().unwrap()[0] == 1 { slot.lock().unwrap()[0] = 0; thread::sleep(Duration::from_millis(700)); println!("Consumer {} work: {:?}", i, slot); } else if slot.lock().unwrap()[0] == 1 { slot.lock().unwrap()[1] = 0; thread::sleep(Duration::from_millis(700)); println!("Consumer {} work: {:?}", i, slot); } } }); producer_handle.join().unwrap(); consumer_handle.join().unwrap(); } } fn main() { work(); println!("{:?}", slot); }
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.31s
Running `target/debug/parallel`
Producer 0 work: Mutex { data: [1], poisoned: false, .. }
Producer 1 work: Mutex { data: [0, 1], poisoned: false, .. }
Consumer 1 work: Mutex { data: [0, 1], poisoned: false, .. }
Producer 2 work: Mutex { data: [0, 1, 1], poisoned: false, .. }
Producer 3 work: Mutex { data: [0, 1, 1, 1], poisoned: false, .. }
Producer 4 work: Mutex { data: [0, 1, 1, 1, 1], poisoned: false, .. }
Producer 5 work: Mutex { data: [0, 1, 1, 1, 1], poisoned: false, .. }
Consumer 5 work: Mutex { data: [0, 1, 1, 1, 1], poisoned: false, .. }
Producer 6 work: Mutex { data: [1, 1, 1, 1, 1], poisoned: false, .. }
Producer 7 work: Mutex { data: [1, 1, 1, 1, 1], poisoned: false, .. }
Consumer 7 work: Mutex { data: [1, 1, 1, 1, 1], poisoned: false, .. }
Producer 8 work: Mutex { data: [1, 1, 1, 1, 1], poisoned: false, .. }
Consumer 8 work: Mutex { data: [1, 1, 1, 1, 1], poisoned: false, .. }
Producer 9 work: Mutex { data: [1, 1, 1, 1, 1], poisoned: false, .. }
Consumer 9 work: Mutex { data: [1, 1, 1, 1, 1], poisoned: false, .. }