中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Rust中Send和Sync有什么區別

發布時間:2021-06-22 16:37:36 來源:億速云 閱讀:506 作者:Leah 欄目:編程語言

Rust中Send和Sync有什么區別,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

定義

  • Send: 變量可以安全的發送給另一個線程,

  • Sync:可以在多個線程之前共享,(當且僅當&T實現了Send時,T實現了Send)

典型的例子是

  • Rc即不是Send也不是Sync

  • Cell、RefCell是Send,不是Sync。

Send限制變量的move。Rust中所有的變量都是可以move的,但是要實現跨越線程的move,變量必需實現Send。

如下面的例子

fn main() {
    let msg = "message".to_string();
    std::thread::spawn(move || {
        println!("msg={:?}", msg);
    }).join();

    let msg = std::rc::Rc::new("message".to_string());
    std::thread::spawn(move || {
        println!("msg={:?}", msg);
    }).join();
}

編譯時會報錯

error[E0277]: `std::rc::Rc<std::string::String>` cannot be sent between threads safely
   --> src/main.rs:8:5
    |
8   |       std::thread::spawn(move || {
    |  _____^^^^^^^^^^^^^^^^^^_-
    | |     |
    | |     `std::rc::Rc<std::string::String>` cannot be sent between threads safely
9   | |         println!("msg={:?}", msg);
10  | |     }).join();
    | |_____- within this `[closure@src/main.rs:8:24: 10:6 msg:std::rc::Rc<std::string::String>]`
    |
    = help: within `[closure@src/main.rs:8:24: 10:6 msg:std::rc::Rc<std::string::String>]`, the trait `std::marker::Send` is not implemented for `std::rc::Rc<std::string::String>`
    = note: required because it appears within the type `[closure@src/main.rs:8:24: 10:6 msg:std::rc::Rc<std::string::String>]`

error: aborting due to previous error

String類型實現了Send,所以可以move到另一個線程。Rc這種可以通過Rc::clone()復制多個Rc,Rc的引用計數的增減非原子操作,多線程環境下會出錯,所以Rc沒有實現Send。

而Sync本質上是要保證&T是Send的。Rust中變量在同一時間可以有多個不可變引用,對于String,Vec這些類型,不同的線程可以共享不可變引用,相當于多個線程共同讀。

Rust中無法實現Sync的主要有兩種

  • Rc這種引用計數的類型

  • Cell和RefCell 這類提供了內部可變性的類型。

Cell和RefCell提供內部可變性,即使擁有的是不可變飲用,也可以修改變量內部的值,所以這兩個無法實現Send。如果需要跨線程的內部可變性,可以使用Mutex或者Atomic類型。

關于Rust中Send和Sync有什么區別問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

石河子市| 芦溪县| 茌平县| 清苑县| 桃园县| 杭锦后旗| 金坛市| 蒙阴县| 乐业县| 开阳县| 原平市| 平阳县| 牙克石市| 平山县| 蒙山县| 偏关县| 濉溪县| 天峻县| 泰宁县| 玛多县| 绵阳市| 贵南县| 大洼县| 张家口市| 夏邑县| 金山区| 福鼎市| 虹口区| 墨江| 弥渡县| 赤壁市| 东平县| 盱眙县| 保德县| 剑河县| 茌平县| 清水县| 兰溪市| 临武县| 杂多县| 淮安市|