亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

彝良县| 墨脱县| 磐石市| 永川市| 遂昌县| 安溪县| 宁城县| 若羌县| 平武县| 开封县| 合肥市| 肃北| 南丹县| 苏尼特右旗| 松桃| 沛县| 德保县| 海宁市| 从江县| 安丘市| 韶关市| 梁河县| 兰坪| 青冈县| 奈曼旗| 个旧市| 庄浪县| 安新县| 凌海市| 怀化市| 鹤山市| 龙岩市| 明光市| 通榆县| 盐池县| 天津市| 图木舒克市| 陈巴尔虎旗| 白沙| 彭阳县| 宁陵县|