色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

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

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來實(shí)現(xiàn)。

pubunsafeautotraitSync{}

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

換言之,opt-in對(duì)應(yīng)還有個(gè)opt-out,可以通過!(negative trait impl)語法來實(shí)現(xiàn)。

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

unsafeimplSendforWrapper{}
unsafeimpl!SyncforWrapper{}

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

1.auto trait

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

rustuptoolchaininstallnightly

下面以自定義auto trait實(shí)現(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());

這里給了一個(gè)簡(jiǎn)單的例子,展示了auto trait的用法,當(dāng)沒有實(shí)現(xiàn)(通過!)auto trait時(shí),編譯器會(huì)在編譯階段報(bào):the trait XXX is not implemented for YYY。

2.Send與Sync

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

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

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

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

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

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

t.join().unwrap();
}

報(bào)錯(cuò):

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

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

unsafeimplSendforArc{}
unsafeimplSyncforArc{}

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

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

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

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

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

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

Mutex與RwLock

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

Arc::new(Foo{}))

在Go中使用Mutex,張這個(gè)樣子:

vmap[string]int
muxsync.Mutex

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

unsafeimplSendforMutex{}
unsafeimplSyncforMutex{}

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

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

unsafeimplSendforRwLock{}
unsafeimplSyncforRwLock{}

小知識(shí)

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

其實(shí)也比較簡(jiǎn)單:可以通過如下多種方法:

自定義類型

將raw pointer包裹起來即可。

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

Box

使用智能指針Box。

Box::new(my_num)






審核編輯:劉清

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

    關(guān)注

    0

    文章

    42

    瀏覽量

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

    關(guān)注

    0

    文章

    57

    瀏覽量

    3009

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    2019年中級(jí)通信工程師考試重點(diǎn)知識(shí)講解

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

    Systick定時(shí)器基礎(chǔ)知識(shí)講解

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

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

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

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

    筆者的開發(fā)板是正點(diǎn)原子的stm32F103zet6迷你板。串口的使用是USART1.單片機(jī)相關(guān)串口的程序就不講解,編寫上位機(jī)程序是使用C++語言,在VS2017里面編寫,下面進(jìn)入正題。一、相關(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

    高頻放大電路知識(shí)講解

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

    手機(jī)硬件知識(shí)講解【PDF】

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

    Java設(shè)計(jì)知識(shí)講解

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

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

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

    C語言基礎(chǔ)知識(shí)講解

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

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

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

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

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

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

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

    電路基礎(chǔ)知識(shí)講解

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

    SPI協(xié)議知識(shí)講解

    電子發(fā)燒友網(wǎng)站提供《SPI協(xié)議知識(shí)講解.ppt》資料免費(fèi)下載
    發(fā)表于 11-16 10:41 ?3次下載
    SPI協(xié)議<b class='flag-5'>知識(shí)</b><b class='flag-5'>講解</b>
    主站蜘蛛池模板: 青青久久久| 伊人久在线| 99久久精品免费看国产免费| 国产偷啪自怕网| 日本熟妇乱妇熟色A片蜜桃亚洲| 永久免费无码AV国产网站| 国产剧果冻传媒星空在线观看| 男生脱美女内裤内衣动态图| 亚洲精品一线二线三线无人区| 邓奴的视频IVK| 女人被躁到高潮嗷嗷叫69| 野花日本高清在线观看免费吗| 国产精品第1页| 青青伊人网| 91久久偷偷做嫩草影院免| 精品国产福利一区二区在线| 兽交白浆喷水高潮| 啊…嗯啊好深男男高h文| 两个人在线观看的视频720| 亚洲午夜精品A片久久WWW解说| 国产精品99久久久久久AV蜜臀| 青草在线在线d青草在线| 2018久久视频在线视频观看| 九九视频在线观看视频6| 亚洲AV无码专区国产乱码网站| 国产福利秒拍weipai.ee| 日韩亚洲欧美中文高清| JizzJizzJizz亚洲成年| 美女脱了内裤张开腿让男人桶到爽 | 香蕉人人超人人超碰超国产| 超碰人热人人热人人看| 欧美午夜理伦三级在线观看| 99久久国产综合色| 美女MM131爽爽爽| 坠落的丝袜美人妻| 久久婷婷久久一区二区三区 | 97色伦亚洲自偷| 久久爽狠狠添AV激情五月| 亚洲中久无码永久在线| 红尘影院手机在线观看| 亚洲精品不卡视频|