我发现这个例子编译成功了,但是Rc〈〉线程不安全吗?如果tikio启动多线程来执行测试fn,会不会导致Rc在不同的线程上运行?
use std::rc::Rc;
use tokio::join;
use std::time;
use async_std::task::{sleep};
async fn test(t:Rc<String>){
let k = t;
println!("1. test,{:?}", k);
sleep(time::Duration::from_secs(1)).await;
println!("2. test,{:?}", k);
}
#[tokio::main]
async fn main() {
let r = Rc::new("abc".to_string());
let f1 = test(r.clone());
let f2 = test(r.clone());
join!(f1,f2);
}
1条答案
按热度按时间jckbn6z71#
这有点微妙,但是
#[tokio::main]
会将您的async main()
重写为如下形式:最后一个实际运行所有内容的步骤
.block_on()
并不要求给定的任务是线程安全的(也就是实现Send
),因为它不会在单独的线程上运行,即使使用多线程执行器也是如此:这在当前线程上运行给定的future,阻塞直到它完成,并产生它的解析结果。
其他时雄工具和任何衍生的任务可以在单独的线程上运行,甚至可以在它们之间移动,但初始任务不能。