精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

重點講解Send與Sync相關的并發知識

jf_wN0SrCdH ? 來源:光城 ? 2023-01-16 09:54 ? 次閱讀

Rust那些事之并發Send與Sync

Send與Sync在Rust中屬于marker trait,代碼位于marker.rs,在標記模塊中還有Copy、Unpin等trait。

在marker.rs中是通過auto trait來實現。

pubunsafeautotraitSync{}

auto trait又稱為opt-in, built-in trait (OIBIT)。這是一種不穩定的特性,每個類型都會自動實現一個特征,除非它們選擇退出或包含一個不實現該特征的類型。

換言之,opt-in對應還有個opt-out,可以通過!(negative trait impl)語法來實現。

例如:下面代碼中第一行表示類型Wrapper實現了Send,但是卻沒實現Sync。

unsafeimplSendforWrapper{}
unsafeimpl!SyncforWrapper{}

本節將會重點講解Send、Sync相關的并發知識。

1.auto trait

可以通過安裝nightly版使用feature特性。

rustuptoolchaininstallnightly

下面以自定義auto trait實現為例:

#![feature(negative_impls)]
#![feature(auto_traits)]
autotraitIsCool{}

impl!IsCoolforString{}

structMyStruct;
structHasAString(String);

fncheck_cool(_:C){}

調用:

check_cool(42);
check_cool(false);
check_cool(MyStruct);
#thetrait`IsCool`isnotimplementedfor`std::String`
check_cool(String::new());

這里給了一個簡單的例子,展示了auto trait的用法,當沒有實現(通過!)auto trait時,編譯器會在編譯階段報:the trait XXX is not implemented for YYY。

2.Send與Sync

Send含義:跨線程move,ownership。Sync含義:跨線程share data,borrow。

通常在我們編譯多線程代碼時,會存在所有權轉移、數據共享。那么問題來了,Rc與原生指針是否可以在多線程使用呢?

我們打開Rc(Reference Counting, 引用計數)的源碼可以看到這里使用了negative trait,并沒有實現Send與Sync,因此通過Rc包裹的對象并不是線程安全的,只能用在單線程中。

impl!marker::SendforRc{}
impl!marker::SyncforRc{}

如果我們將它用在多線程中,會出什么問題呢?

fnmain(){
letval=std::new(5);
lett=std::spawn(move||{
println!("thisisathreadval:{}",val);
});

t.join().unwrap();
}

報錯:

error[E0277]:`Rc`cannotbesentbetweenthreadssafely
...
thetrait`Send`isnotimplementedfor`Rc`
...

與之對應,Arc(Atomic Reference Counted, 原子引用計數),可以看一下源碼實現:

unsafeimplSendforArc{}
unsafeimplSyncforArc{}

Send與Sync都實現了。

Send可以實現在多線程間安全傳遞所有權,Sync可以線程安全的共享數據(例如:引用)。

此外,官方文檔:當且僅當類型T的引用&T是Send,T是Sync。

大概意思就是如果引用都無法在多線程之前傳遞,那么底層數據變無法進行數據共享了。

marker.rs中還有段比較重要的代碼,表示原生指針不是線程安全的,沒有實現Send、Sync trait。

impl!Sendfor*constT{}
impl!Sendfor*mutT{}
impl!Syncfor*constT{}
impl!Syncfor*mutT{}

Mutex與RwLock

Mutex與RwLock相比于其他語言來說,實現了用戶友好的接口,通過new即可將類型傳遞進去。

Arc::new(Foo{}))

在Go中使用Mutex,張這個樣子:

vmap[string]int
muxsync.Mutex

可以看到rust一行便可以知道保護的是哪個數據。Mutex是用來保護共享變量,所以這個變量類型T我們猜測可以是安全的,也可以是不安全的,所以Sync是不被要求的,因此我們看源碼:

unsafeimplSendforMutex{}
unsafeimplSyncforMutex{}

Mutex會去實現Send與Sync,要求的類型T一定是具有所有權(實現Send),但是并不要求數據是否是安全的(沒實現Sync)。

同理:RwLock是讀寫鎖,需要滿足并發讀,因此要求T必須實現Sync。

unsafeimplSendforRwLock{}
unsafeimplSyncforRwLock{}

小知識

前面講解了raw pointer并不是線程安全的,那么如何實現線程安全呢?

其實也比較簡單:可以通過如下多種方法:

自定義類型

將raw pointer包裹起來即可。

structWrapper(*muti32);
unsafeimplSendforWrapper{}
unsafeimplSyncforWrapper{}

Box

使用智能指針Box。

Box::new(my_num)






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • ARC
    ARC
    +關注

    關注

    0

    文章

    42

    瀏覽量

    16460
  • rust語言
    +關注

    關注

    0

    文章

    57

    瀏覽量

    3006

原文標題:Rust那些事之并發Send與Sync

文章出處:【微信號:Rust語言中文社區,微信公眾號:Rust語言中文社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    2019年中級通信工程師考試重點知識講解

    通信工程師最新大綱定制課程,根據教材每個章節講解資料,讓你在快速掌握新大綱的重點考點。幫助你通過考試。適合人群:期望在最短的時間內通過中級通信工程師考試的行業從業人員;通信工程師備考人員
    發表于 08-16 12:03

    Systick定時器基礎知識講解

    Systick定時器基礎知識講解Systick相關寄存器庫函數講解delay延時函數講解(Systick應用)(借鑒正點原子網課)(一)Sy
    發表于 08-19 07:18

    詳細介紹了Java泛型、注解、并發編程

    介紹了Java泛型、注解、并發編程、數據傳輸與序列化、高效IO、容器集合、反射與類加載以及JVM重點知識線程、內存模型、JVM運行時內存、垃圾回收與算法、Java中四種引用類型、GC 分代收集算法
    發表于 08-20 06:09

    詳細講解C++串口的相關知識

    筆者的開發板是正點原子的stm32F103zet6迷你板。串口的使用是USART1.單片機相關串口的程序就不講解,編寫上位機程序是使用C++語言,在VS2017里面編寫,下面進入正題。一、相關
    發表于 08-24 06:56

    LPUART_RTOS_Send() 停止FreeRTOS SwTimer周期,如何修復它并發送UART消息1秒?

    SwTimerCallback()中添加LPUART_RTOS_Send()停止SwTimer 1秒周期回調,注釋LPUART_RTOS_Send()SwTimer周期正常。我附上了修改后的 freertos_lpuart.c。 如何修復它
    發表于 03-24 08:34

    高頻放大電路知識講解

    高頻放大電路知識講解
    發表于 05-25 21:57 ?900次下載

    手機硬件知識講解【PDF】

    手機硬件知識講解
    發表于 01-17 19:47 ?109次下載

    Java設計知識講解

    本文檔內容介紹了基于Java設計知識講解,供參考
    發表于 03-26 11:09 ?16次下載

    fmax相關知識講解資料下載

    電子發燒友網為你提供fmax相關知識講解資料下載的電子資料下載,更有其他相關的電路圖、源代碼、課件教程、中文資料、英文資料、參考設計、用戶指南、解決方案等資料,希望可以幫助到廣大的電子
    發表于 03-30 08:40 ?10次下載
    fmax<b class='flag-5'>相關</b><b class='flag-5'>知識</b><b class='flag-5'>講解</b>資料下載

    C語言基礎知識講解

    C語言基礎知識講解
    發表于 05-19 17:39 ?13次下載

    EMC的原理基礎知識講解

    EMC的原理基礎知識講解免費下載。
    發表于 05-28 16:54 ?44次下載

    華為防雷接地基礎知識講解

    華為防雷接地基礎知識講解
    發表于 06-03 10:24 ?23次下載

    CAN總線的基礎知識詳細講解

    CAN總線的基礎知識詳細講解
    發表于 04-02 17:44 ?14次下載

    電路基礎知識講解

    內含電源,電路基本知識講解,電路元件的伏安特性,功率特性等,簡單易懂。
    發表于 10-11 16:46 ?17次下載

    SPI協議知識講解

    電子發燒友網站提供《SPI協議知識講解.ppt》資料免費下載
    發表于 11-16 10:41 ?2次下載
    SPI協議<b class='flag-5'>知識</b><b class='flag-5'>講解</b>