rust 为什么Rc以异步方式工作fn

lf3rwulv  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(117)

我发现这个例子编译成功了,但是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);
}
jckbn6z7

jckbn6z71#

这有点微妙,但是#[tokio::main]会将您的async main()重写为如下形式:

fn main() {
    tokio::runtime::Builder::new_multi_thread()
        .enable_all()
        .build()
        .unwrap()
        .block_on(async {
            // your code from `async main()`
        })
}

最后一个实际运行所有内容的步骤.block_on()并不要求给定的任务是线程安全的(也就是实现Send),因为它不会在单独的线程上运行,即使使用多线程执行器也是如此:
这在当前线程上运行给定的future,阻塞直到它完成,并产生它的解析结果。
其他时雄工具和任何衍生的任务可以在单独的线程上运行,甚至可以在它们之间移动,但初始任务不能。

相关问题