【发布时间】:2019-04-01 21:54:43
【问题描述】:
在玩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,它实际上会唤醒所有 9 个。
我已经在wait() 和notify_one() 上仔细检查了the documentation,但这里有什么问题并不明显。
有什么想法吗?这是一个错误还是我做错了什么?
【问题讨论】:
标签: multithreading rust