Rust 学习笔记:关于通过异步实现并发的练习题
Rust 学习笔记:关于通过异步实现并发的练习题
参考视频:
- https://www.bilibili.com/video/BV16JZSYxEeb
问题一
该函数的输出是什么?
async fn print_letters() {
let a = async { println!("A") };
let b = async { println!("B") };
let c = async { println!("C") };
c.await;
b.await;
a.await;
}
答:
C
B
A
问题二
假设有这样一个异步函数:
async fn print_letters() {
let fut1 = async {
print!("A");
sleep().await;
print!("B");
};
let fut2 = async {
print!("C");
sleep().await;
print!("D");
};
wait_all(fut1, fut2).await;
}
wait_all(a, b) 保证 a 和 b 都执行完,但不保证公平性和初始执行顺序。
print_letters().await 可能的结果是?
A. DABC
B. ABCD
C. CADB
D. ACBD
答:B、C、D。
问题三
假设有如下异步代码:
let (tx, mut rx) = channel(16);
let recv_fut = rx.recv();
let send_fut = tx.send(0);
let (n, _) = join(recv_fut, send_fut).await;
println!("{}", n.unwrap());
channel 是无阻塞且 bounded 的,这意味着 send 返回一个 future,当通道还有容量时该 future 会完成。并且 join(a, b) 会公平地等待其两个参数完成。
执行这段代码会发生什么?
A. 程序什么也不打印并永远循环
B. 程序打印 0 并永远循环
C. 程序打印 0 并退出
D. 程序 panic
答:C。