【发布时间】:2020-02-03 00:24:06
【问题描述】:
考虑下面的代码
extern crate futures; // v0.1 (old)
use std::sync::{atomic, Arc};
use futures::*;
struct F(Arc<atomic::AtomicBool>);
impl Future for F {
type Item = ();
type Error = ();
fn poll(&mut self) -> Result<Async<Self::Item>, Self::Error> {
println!("Check if flag is set");
if self.0.load(atomic::Ordering::Relaxed) {
Ok(Async::Ready(()))
} else {
Ok(Async::NotReady)
}
}
}
fn main() {
let flag = Arc::new(atomic::AtomicBool::new(false));
let future = F(flag.clone());
::std::thread::spawn(move || {
::std::thread::sleep_ms(10);
println!("set flag");
flag.store(true, atomic::Ordering::Relaxed);
});
// ::std::thread::sleep_ms(20);
let result = future.wait();
println!("result: {:?}", result);
}
生成的线程设置一个标志,未来等待。
我们还使生成的线程休眠,因此来自.wait() 的初始.poll() 调用是在设置标志之前。这会导致.wait() 无限期地阻塞(看似)。如果我们取消注释另一个 thread::sleep_ms,.wait() 返回,并打印出结果 (())。
我希望当前线程尝试通过多次调用poll 来解决未来问题,因为我们正在阻塞当前线程。然而,这并没有发生。
我尝试阅读some docs,似乎问题在于第一次从poll 获取NotReady 后,该线程是parked。但是,我不清楚为什么会这样,或者如何解决这个问题。
我错过了什么?
【问题讨论】:
标签: multithreading rust future