91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

阿合奇县| 贵州省| 桂阳县| 鄂尔多斯市| 三台县| 乌苏市| 辛集市| 南丰县| 桂阳县| 通榆县| 晋宁县| 社旗县| 宿州市| 曲水县| 封开县| 东丰县| 富顺县| 东乌珠穆沁旗| 澜沧| 博罗县| 卓尼县| 黑水县| 山阴县| 宿迁市| 凤庆县| 尉犁县| 密云县| 金门县| 栾川县| 民权县| 阳信县| 巢湖市| 吉林市| 黄陵县| 封开县| 乌兰浩特市| 绥芬河市| 宣武区| 广安市| 三原县| 康定县|