我發現這個例子編譯成功了,但是 Rc<> 執行緒不是不安全嗎?tikio啟動多執行緒執行test 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);
}
uj5u.com熱心網友回復:
這有點細微差別,但#[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()不需要給定任務是執行緒安全的(也稱為 implement Send),因為它不會在單獨的執行緒上運行,即使在使用多執行緒執行程式時也是如此:
這將在當前執行緒上運行給定的未來,阻塞直到它完成,并產生其解決的結果。
其他 tokio 實用程式和任何派生的任務可以在單獨的執行緒上運行,甚至可以在它們之間移動,但不是初始任務。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/537065.html
標籤:异步锈
