在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內(nèi)不再提示

重點講解Send與Sync相關(guān)的并發(fā)知識

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

Rust那些事之并發(fā)Send與Sync

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

在marker.rs中是通過auto trait來實現(xiàn)。

pubunsafeautotraitSync{}

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

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

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

unsafeimplSendforWrapper{}
unsafeimpl!SyncforWrapper{}

本節(jié)將會重點講解Send、Sync相關(guān)的并發(fā)知識。

1.auto trait

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

rustuptoolchaininstallnightly

下面以自定義auto trait實現(xiàn)為例:

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

impl!IsCoolforString{}

structMyStruct;
structHasAString(String);

fncheck_cool(_:C){}

調(diào)用:

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

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

2.Send與Sync

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

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

我們打開Rc(Reference Counting, 引用計數(shù))的源碼可以看到這里使用了negative trait,并沒有實現(xiàn)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, 原子引用計數(shù)),可以看一下源碼實現(xiàn):

unsafeimplSendforArc{}
unsafeimplSyncforArc{}

Send與Sync都實現(xiàn)了。

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

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

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

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

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

Mutex與RwLock

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

Arc::new(Foo{}))

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

vmap[string]int
muxsync.Mutex

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

unsafeimplSendforMutex{}
unsafeimplSyncforMutex{}

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

同理:RwLock是讀寫鎖,需要滿足并發(fā)讀,因此要求T必須實現(xiàn)Sync。

unsafeimplSendforRwLock{}
unsafeimplSyncforRwLock{}

小知識

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

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

自定義類型

將raw pointer包裹起來即可。

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

Box

使用智能指針Box。

Box::new(my_num)






審核編輯:劉清

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

    關(guān)注

    0

    文章

    42

    瀏覽量

    16551
  • rust語言
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

    3028

原文標題:Rust那些事之并發(fā)Send與Sync

文章出處:【微信號:Rust語言中文社區(qū),微信公眾號:Rust語言中文社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

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

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

    Systick定時器基礎知識講解

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

    詳細介紹了Java泛型、注解、并發(fā)編程

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

    詳細講解C++串口的相關(guān)知識

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

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

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

    高頻放大電路知識講解

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

    手機硬件知識講解【PDF】

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

    Java設計知識講解

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

    fmax相關(guān)知識講解資料下載

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

    C語言基礎知識講解

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

    EMC的原理基礎知識講解

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

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

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

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

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

    電路基礎知識講解

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

    SPI協(xié)議知識講解

    電子發(fā)燒友網(wǎng)站提供《SPI協(xié)議知識講解.ppt》資料免費下載
    發(fā)表于 11-16 10:41 ?3次下載
    SPI協(xié)議<b class='flag-5'>知識</b><b class='flag-5'>講解</b>
    主站蜘蛛池模板: 波多野结衣在线免费视频 | 亚洲综合国产一区二区三区 | 男人的网址| 女同激情视频 | 国产无限资源 | 三级精品在线观看 | 亚洲男人a天堂在线2184 | 色老头在线精品视频在线播放 | 色视频网站色视频播放 | 久久精品免费视频观看 | 天天综合网天天做天天受 | 美女扒开腿让男生桶爽网站 | 绝色村妇的泛滥春情 | 免费国产zzzwww色 | 日韩系列 | 亚洲操 | 在线观看886影院成人影院 | 天天色踪合合 | 手机在线看片福利盒子 | 久久一级毛片 | 久久久久久久国产免费看 | 免费又黄又硬又大爽日本 | 一区二区三区中文国产亚洲 | 黄色录像欧美 | 亚洲日本一区二区三区 | 性欧美护士18xxxxhd视频 | 日本69xxⅹxxxxxx19| 一区二区免费视频 | 欧美一级片在线视频 | 日日摸人人看97人人澡 | 玖玖色视频| 国产乱码1卡一卡二卡 | 情趣店上班h系列小说 | 性夜黄 a 爽免费看 性夜黄a爽影免费看 | 国模私拍在线视频 | 国产在线高清精品二区色五郎 | 丁香五六月婷婷 | 亚洲va国产va天堂va久久 | 欧美精品一区在线看 | 三级网站在线免费观看 | 欧美三级视频网 |