方法1(工程):
pub fn spawn_good<F, R>(future: F) -> JoinHandle<R>
where
F: Future<Output = R> + 'static + Send,
R: Send + 'static,
{
let (sender, recvr) = oneshot::channel();
let future = async move {
sender.send(future.await);
};
let task = Arc::new(Task {
state: AtomicUsize::new(0),
future: Mutex::new(Box::pin(future)),
});
Box::pin(async { recvr.await.unwrap() })
}
方法2(不起作用):
pub fn spawn_bad<F, R>(future: F) -> JoinHandle<R>
where
F: Future<Output = R> + 'static + Send,
R: Send + 'static,
{
let (sender, recvr) = oneshot::channel();
let future = async move {
sender.send(future.await);
};
let future = Mutex::new(Box::pin(future));
let task = Arc::new(Task {
state: AtomicUsize::new(0),
future,
});
Box::pin(async { recvr.await.unwrap() })
}
expected struct `std::sync::Mutex<Pin<Box<(dyn futures::Future<Output = ()> + std::marker::Send + 'static)>>>`
found struct `std::sync::Mutex<Pin<Box<impl futures::Future<Output = [async output]>>>>`
任务定义:
struct Task {
state: AtomicUsize,
future: Mutex<Pin<Box<dyn Future<Output = ()> + Send>>>
}
JoinHandle定义:
type JoinHandle<T> = Pin<Box<dyn Future<Output = T> + Send>>;
我不明白为什么第二种方法行不通.唯一的区别是额外的分配.我错过的Mutex
个有什么细微差别吗?