您好,登錄后才能下訂單哦!
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有什么區別問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。