最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解Rust中的 Send 和 Sync trait

 更新時(shí)間:2025年11月24日 11:11:58   作者:alwaysrun  
Rust中的標(biāo)記 trait(Marker Trait)Send和Sync是并發(fā)安全的核心基石,這篇文章給大家介紹Rust中的Send和Sync trait,感興趣的朋友跟隨小編一起看看吧

Rust中的標(biāo)記 trait(Marker Trait)SendSync 是并發(fā)安全的核心基石。用于標(biāo)記類型的并發(fā)安全屬性,讓編譯器在編譯時(shí)檢查線程間數(shù)據(jù)傳遞的合法性,從根源上避免數(shù)據(jù)競爭(Data Race)。

  • Send:類型的值能不能在線程之間“移動所有權(quán)”。
  • Sync:類型的值能不能在多個線程中“共享引用 &T”。
    • 對同一個值進(jìn)行并發(fā)訪問(只讀)是內(nèi)存安全的。
    • 并發(fā)修改仍然要靠鎖/原子/其他機(jī)制。

Send

一個類型 TSend,表示把 T 的一個 值 從一個線程移動到另一個線程,不會引發(fā)數(shù)據(jù)競爭或內(nèi)存安全問題。

  • 移動的是 所有權(quán),而不是引用。
  • 移動之后,原線程不能再用這個值(所有權(quán)已經(jīng)被 move)。

絕大多數(shù)類型自動實(shí)現(xiàn) Send,以下一些例外(!Send):

  • Rc<T>:引用計(jì)數(shù)是非原子操作,跨線程轉(zhuǎn)移會導(dǎo)致計(jì)數(shù)競爭(數(shù)據(jù)競爭)。
  • RefCell<T>/Cell<T>:內(nèi)部可變性無同步機(jī)制,跨線程轉(zhuǎn)移后,多個線程可能同時(shí)修改數(shù)據(jù)。
  • 裸指針 *const T/*mut T:無安全保證,直接跨線程轉(zhuǎn)移可能導(dǎo)致懸垂指針或數(shù)據(jù)競爭。
  • UnsafeCell<T>:內(nèi)部可變性的底層實(shí)現(xiàn),本身 !Send(但基于它的線程安全類型如 Mutex 會手動實(shí)現(xiàn) Send)。
use std::thread;
fn main() {
    let v = vec![1, 2, 3];
    // Vec<i32> 是 Send,通過move把所有權(quán)移到線程中
    let handle = thread::spawn(move || {
        println!("{:?}", v);
    });
    handle.join().unwrap();
}

sync

一個類型 TSync,表示可以安全地被多個線程共享(即 &TSend)。即,如果一個類型的引用 &T 能安全跨線程傳遞,那么這個類型就是 Sync(多個線程持有 &T 不會導(dǎo)致數(shù)據(jù)競爭)。

任何允許通過 共享引用 &T 獲得可變訪問 且沒有同步保護(hù)的類型,都不是 Sync

  • Cell<T> / RefCell<T>:允許通過 &T 改變內(nèi)部數(shù)據(jù)(“內(nèi)部可變性”),但不保證線程安全。
  • Rc<T>:通過共享引用可以克隆 Rc 得到更多引用,從而在多線程下導(dǎo)致競爭。
  • 非線程安全的 FFI 對象,如果通過 & 能調(diào)用會修改內(nèi)部狀態(tài)的方法。
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
    let data = Arc::new(Mutex::new(5)); // Arc<Mutex<i32>>
    let data_clone = data.clone();
    thread::spawn(move || {
        let mut guard = data_clone.lock().unwrap(); // 加鎖,獨(dú)占訪問
        *guard += 1;
    }).join().unwrap();
    println!("{}", data.lock().unwrap()); // 輸出 6
}

auto trait

SendSync 都是 auto trait,編譯器會根據(jù)類型的組成部分自動推導(dǎo)實(shí)現(xiàn)。

性質(zhì)含義常見例子
Send + Sync可以在線程間移動,也可以多線程共享引用i32, Mutex<T>
Send + !Sync可以在線程間移動,但不能多線程共享引用一些 *mut T封裝,Sender<T>
!Send + Sync不能跨線程移動;不移動,只讀共享是安全的(較少見)少數(shù)特殊 FFI 對象
!Send + !Sync既不能跨線程移動,也不能多線程共享引用Rc<RefCell<T>>

只有在特殊情況下(寫 底層庫 / FFI 封裝 / 自己的鎖和原子數(shù)據(jù)結(jié)構(gòu) 時(shí))才會需要手動實(shí)現(xiàn)SendSync

  • unsafe impl Send / unsafe impl Sync 是非常嚴(yán)肅的承諾
  • 要自己保證所有可能的并發(fā)訪問路徑都不會產(chǎn)生數(shù)據(jù)競爭、懸垂指針等。
use std::sync::Mutex;
// 自定義類型:用 Mutex 保護(hù)裸指針(裸指針本身 !Send/!Sync)
struct SafePtr<T>(Mutex<*mut T>);
impl<T> SafePtr<T> {
    fn new(value: T) -> Self {
        let ptr = Box::into_raw(Box::new(value)); // 裸指針指向堆內(nèi)存
        SafePtr(Mutex::new(ptr))
    }
    // 安全訪問:通過 Mutex 加鎖,保證獨(dú)占訪問
    fn get(&self) -> Option<&T> {
        let guard = self.0.lock().ok()?;
        unsafe { (*guard).as_ref() } // 裸指針解引用需 unsafe,但鎖保證安全
    }
}
// 手動實(shí)現(xiàn) Send/Sync:因?yàn)閮?nèi)部用 Mutex 保護(hù),訪問裸指針是線程安全的
unsafe impl<T> Send for SafePtr<T> {}
unsafe impl<T> Sync for SafePtr<T> {}
// 測試:跨線程共享 SafePtr
fn main() {
    let ptr = SafePtr::new(5);
    let ptr_clone = Arc::new(ptr);
    let ptr_clone2 = ptr_clone.clone();
    thread::spawn(move || {
        println!("線程內(nèi)訪問:{}", ptr_clone2.get().unwrap()); // 安全
    }).join().unwrap();
}

到此這篇關(guān)于深入理解Rust中的 Send 和 Sync trait的文章就介紹到這了,更多相關(guān)Rust Send 和 Sync trait內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Rust生命周期之驗(yàn)證引用有效性與防止懸垂引用方式

    Rust生命周期之驗(yàn)證引用有效性與防止懸垂引用方式

    本文介紹了Rust中生命周期注解的應(yīng)用,包括防止懸垂引用、在函數(shù)中使用泛型生命周期、生命周期省略規(guī)則、在結(jié)構(gòu)體中使用生命周期、靜態(tài)生命周期以及如何將生命周期與泛型和特質(zhì)約束結(jié)合,通過這些機(jī)制,Rust在編譯時(shí)就能捕獲內(nèi)存安全問題
    2025-02-02
  • 詳解Rust中#[derive]屬性怎么使用

    詳解Rust中#[derive]屬性怎么使用

    在 Rust 中,#[derive] 是一個屬性,用于自動為類型生成常見的實(shí)現(xiàn),下面就跟隨小編一起來學(xué)習(xí)一下Rust中derive屬性的具體使用吧
    2024-11-11
  • rust中async/await的使用示例詳解

    rust中async/await的使用示例詳解

    在Rust中,async/await用于編寫異步代碼,使得異步操作更易于理解和編寫,通過使用await,在async函數(shù)或代碼塊中等待Future完成,而不會阻塞線程,允許同時(shí)執(zhí)行其他Future,這種機(jī)制簡化了異步編程的復(fù)雜性,使代碼更加直觀
    2024-10-10
  • 解讀Rust的Rc<T>:實(shí)現(xiàn)多所有權(quán)的智能指針方式

    解讀Rust的Rc<T>:實(shí)現(xiàn)多所有權(quán)的智能指針方式

    Rc<T> 是 Rust 中用于多所有權(quán)的引用計(jì)數(shù)類型,通過增加引用計(jì)數(shù)來管理共享數(shù)據(jù),只有當(dāng)最后一個引用離開作用域時(shí),數(shù)據(jù)才會被釋放,Rc<T> 適用于單線程環(huán)境,并且只允許不可變共享數(shù)據(jù);需要可變共享時(shí)應(yīng)考慮使用 RefCell<T> 或其他解決方案
    2025-02-02
  • 如何使用Rust的向量存儲值列表

    如何使用Rust的向量存儲值列表

    本文介紹了在Rust中使用向量存儲值列表的方法,包括創(chuàng)建、更新、讀取、遍歷、存儲多種類型以及內(nèi)存釋放等方面,向量是Rust中常用且強(qiáng)大的集合類型,熟練掌握其用法有助于編寫高效且安全的代碼
    2025-02-02
  • Rust聲明宏在不同K線bar類型中的應(yīng)用小結(jié)

    Rust聲明宏在不同K線bar類型中的應(yīng)用小結(jié)

    在K線bar中,往往有很多不同分時(shí)k線圖,比如1,2,3,5,,,,,60,120,250,300…,,不同分鐘類型,如果不用宏,那么手寫會比較麻煩,下面就試用一下宏來實(shí)現(xiàn)不同類型的bar,感興趣的朋友一起看看吧
    2024-05-05
  • rust實(shí)現(xiàn)post小程序(完整代碼)

    rust實(shí)現(xiàn)post小程序(完整代碼)

    這篇文章主要介紹了rust實(shí)現(xiàn)一個post小程序,本文通過示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • Rust 中判斷兩個 HashMap 是否相等

    Rust 中判斷兩個 HashMap 是否相等

    在Rust標(biāo)準(zhǔn)庫中,HashMap 實(shí)現(xiàn)了 PartialEq 和 Eq trait,但是這些trait的實(shí)現(xiàn)是基于嚴(yán)格的結(jié)構(gòu)相等性,包括元素的順序,這篇文章主要介紹了Rust 中判斷兩個 HashMap 是否相等,需要的朋友可以參考下
    2024-04-04
  • Rust應(yīng)用調(diào)用C語言動態(tài)庫的操作方法

    Rust應(yīng)用調(diào)用C語言動態(tài)庫的操作方法

    這篇文章主要介紹了Rust應(yīng)用調(diào)用C語言動態(tài)庫,本文記錄了筆者編寫一個簡單的C語言動態(tài)庫,并通過Rust調(diào)用動態(tài)庫導(dǎo)出的函數(shù),需要的朋友可以參考下
    2023-01-01
  • Rust泛型編程深入實(shí)例介紹應(yīng)用技巧

    Rust泛型編程深入實(shí)例介紹應(yīng)用技巧

    這篇文章主要介紹了Rust泛型編程,泛型是Rust中一種強(qiáng)大的特性,它允許我們編寫通用的代碼,適用于不同類型,通過掌握泛型的高級應(yīng)用,我們可以編寫更加靈活、可復(fù)用的代碼,需要的朋友可以參考下
    2026-05-05

最新評論

大厂| 景谷| 津市市| 凤山市| 额尔古纳市| 旺苍县| 揭西县| 南澳县| 安福县| 黎平县| 铅山县| 河池市| 安丘市| 卢湾区| 吴旗县| 昭通市| 乌兰察布市| 南乐县| 怀远县| 乳源| 达日县| 隆子县| 改则县| 拜泉县| 星座| 板桥市| 新兴县| 海晏县| 龙川县| 科尔| 建宁县| 贡山| 宝山区| 黄冈市| 祥云县| 灵武市| 海南省| 拜城县| 温宿县| 吉木萨尔县| 池州市|