chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

完善資料讓更多小伙伴認識你,還能領(lǐ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,在標(biāo)記模塊中還有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對應(yīng)還有個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的用法,當(dāng)沒有實現(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`
...

與之對應(yīng),Arc(Atomic Reference Counted, 原子引用計數(shù)),可以看一下源碼實現(xiàn):

unsafeimplSendforArc{}
unsafeimplSyncforArc{}

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

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

此外,官方文檔:當(dāng)且僅當(dāng)類型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)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • ARC
    ARC
    +關(guān)注

    關(guān)注

    0

    文章

    47

    瀏覽量

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

    關(guān)注

    0

    文章

    57

    瀏覽量

    3149

原文標(biāo)題: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定時器基礎(chǔ)知識講解

    Systick定時器基礎(chǔ)知識講解Systick相關(guān)寄存器庫函數(shù)講解delay延時函數(shù)講解(Systick應(yīng)用)(借鑒正點原子網(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ù)它并發(fā)送UART消息1秒?

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

    高頻放大電路知識講解

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

    手機硬件知識講解【PDF】

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

    Java設(shè)計知識講解

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

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

    電子發(fā)燒友網(wǎng)為你提供fmax相關(guān)知識講解資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計、用戶指南、解決方案等資料,希望可以幫助到廣大的電子
    發(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語言基礎(chǔ)知識講解

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

    EMC的原理基礎(chǔ)知識講解

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

    華為防雷接地基礎(chǔ)知識講解

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

    CAN總線的基礎(chǔ)知識詳細講解

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

    Firefox Send簡單的文件加密共享

    ./oschina_soft/send.zip
    發(fā)表于 05-30 15:11 ?1次下載
    Firefox <b class='flag-5'>Send</b>簡單的文件加密共享

    SPI協(xié)議知識講解

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