013 Rust 非同步程式設計,Send trait 相關

linghuyichong發表於2020-07-15

async fn Future是否為Send的取決於是否在.await點上保留非Send型別。編譯器盡其所能地估計值在.await點上的儲存時間。

  • 原始碼
use std::rc::Rc;

#[derive(Default)]
struct NotSend(Rc<()>);

async fn bar() {}

async fn foo() {
    NotSend::default();
    bar().await;
}

fn required_send(_: impl Send) {}

fn main() {
    required_send(foo());
}
  • 說明

上述程式碼並不會報錯。但是,如果我們將程式碼foo函式修改為如下:

async fn foo() {
    let x = NotSend::default();
    bar().await;
}
  • 原因分析

如果我們儲存了x變數,那麼在await之前,x可能並不會drop,那麼也就意味著可能會線上程之間傳遞。而Rc是不能線上程之間傳遞的。

  • 解決方式
async fn foo() {
    {
        let x = NotSend::default();
    }
    bar().await;
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結
令狐一衝

相關文章