У меня неожиданные результаты при игре с Condvar
.Я знаю, что не могу поверить, что мои wait()
не проснутся рано, но в моем случае кажется, что один из моих пробуждений постоянно отсутствует.Учитывая этот пример кода:
use std::sync::{Arc, Mutex, Condvar};
use std::{
thread,
time
};
fn main() {
let pair = Arc::new((Mutex::new(false), Condvar::new()));
let pause = time::Duration::from_secs(1);
for id in 0..10 {
let pair2 = pair.clone();
thread::spawn(move|| {
let &(ref lock, ref cvar) = &*pair2;
let lock = lock.lock().unwrap();
let _ = cvar.wait(lock).unwrap();
println!("Thread {} done!", id);
});
}
// Wait for the thread to start up.
let &(ref _lock, ref cvar) = &*pair;
for _ in 0..10 {
thread::sleep(pause);
cvar.notify_one();
}
}
Я получаю только первые восемь потоков из цикла:
Thread 0 done!
Thread 1 done!
Thread 2 done!
Thread 3 done!
Thread 4 done!
Thread 5 done!
Thread 6 done!
Thread 7 done!
Thread 8 done!
Если я увеличу счет во втором цикле до 11, этона самом деле просыпаются все девять.
Я дважды проверил документацию на wait()
и notify_one()
, но не очевидно, что здесь не так.
Любоймысли?Это ошибка или что-то, что я не правильно делаю?