鍍金池/ 教程/ Java/ Send 和 Sync
標(biāo)準(zhǔn)輸入與輸出
消息傳遞
循環(huán)
注釋
Rust for Mac OS
幾種智能指針
Cell, RefCell
trait對(duì)象 (trait object)
rust web 開發(fā)
Unsafe、原始指針
Macro
迭代器
函數(shù)
Borrow, BorrowMut, ToOwned
快速上手
二叉樹
編輯器
測(cè)試與評(píng)測(cè)
Deref
安裝Rust
哈希表 HashMap
原生類型
17.錯(cuò)誤處理
VS Code 安裝配置
動(dòng)態(tài)數(shù)組Vec
模式匹配
操作符和格式化字符串
Rust for Linux
函數(shù)參數(shù)
Visual Studio
vim/GVim安裝配置
閉包作為參數(shù)和返回值
安全(Safety)
Cow
生命周期( Lifetime )
閉包的實(shí)現(xiàn)
所有權(quán)(Ownership)
Atom
將Rust編譯成庫(kù)
類型、運(yùn)算符和字符串
類型系統(tǒng)中的幾個(gè)常見 trait
特性
屬性和編譯器參數(shù)
Spacemacs
集合類型
Rust json處理
Heap & Stack
并行
標(biāo)準(zhǔn)庫(kù)示例
基本程序結(jié)構(gòu)
鏈表
trait 和 trait對(duì)象
前期準(zhǔn)備
代碼風(fēng)格
編譯器參數(shù)
基于語義化版本的項(xiàng)目版本聲明與管理
Rust 版本管理工具: rustup
引用&借用(References&Borrowing)
注釋與文檔
10.1 trait關(guān)鍵字
模式
調(diào)用ffi函數(shù)
unsafe
并發(fā),并行,多線程編程
AsRef 和 AsMut
Rust旅程
Rust for Windows
結(jié)構(gòu)體與枚舉
條件分支
附錄I-術(shù)語表
變量綁定與原生類型
Mutex 與 RwLock
泛型
裸指針
常用數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)
系統(tǒng)命令:調(diào)用grep
Into/From 及其在 String 和 &str 互轉(zhuǎn)上的應(yīng)用
共享內(nèi)存
Sublime
網(wǎng)絡(luò)模塊:W貓的回音
函數(shù)返回值
包和模塊
高階函數(shù)
函數(shù)與方法
match關(guān)鍵字
隊(duì)列
目錄操作:簡(jiǎn)單grep
語句和表達(dá)式
并發(fā)編程
閉包
測(cè)試
閉包的語法
同步
迭代器
String
Send 和 Sync
Rc 和 Arc
屬性
Emacs
優(yōu)先隊(duì)列
Prelude
cargo簡(jiǎn)介
控制流(control flow)
數(shù)組、動(dòng)態(tài)數(shù)組和字符串
FFI
模塊和包系統(tǒng)、Prelude
實(shí)戰(zhàn)篇
Rust 是一門系統(tǒng)級(jí)編程語言,被設(shè)計(jì)為保證內(nèi)存和線程安全,并防止段錯(cuò)誤。作為系統(tǒng)級(jí)編程語言,它的基本理念是 “零開銷抽象”。理
運(yùn)算符重載
Any和反射
rust數(shù)據(jù)庫(kù)操作
輸入輸出流
復(fù)合類型
性能測(cè)試

Send 和 Sync

std::marker 模塊中,有兩個(gè) trait:SendSync,它們與多線程安全相關(guān)。

標(biāo)記為 marker trait 的 trait,它實(shí)際就是一種約定,沒有方法的定義,也沒有關(guān)聯(lián)元素(associated items)。僅僅是一種約定,實(shí)現(xiàn)了它的類型必須滿足這種約定。一種類型是否加上這種約定,要么是編譯器的行為,要么是人工手動(dòng)的行為。

SendSync 在大部分情況下(針對(duì) Rust 的基礎(chǔ)類型和 std 中的大部分類型),會(huì)由編譯器自動(dòng)推導(dǎo)出來。對(duì)于不能由編譯器自動(dòng)推導(dǎo)出來的類型,要使它們具有 SendSync 的約定,可以由人手動(dòng)實(shí)現(xiàn)。實(shí)現(xiàn)的時(shí)候,必須使用 unsafe 前綴,因?yàn)?Rust 默認(rèn)不信任程序員,由程序員自己控制的東西,統(tǒng)統(tǒng)標(biāo)記為 unsafe,出了問題(比如,把不是線程安全的對(duì)象加上 Sync 約定)由程序員自行負(fù)責(zé)。

它們的定義如下:

如果 T: Send,那么將 T 傳到另一個(gè)線程中時(shí)(按值傳送),不會(huì)導(dǎo)致數(shù)據(jù)競(jìng)爭(zhēng)或其它不安全情況。

  1. Send 是對(duì)象可以安全發(fā)送到另一個(gè)執(zhí)行體中;
  2. Send 使被發(fā)送對(duì)象可以和產(chǎn)生它的線程解耦,防止原線程將此資源釋放后,在目標(biāo)線程中使用出錯(cuò)(use after free)。

如果 T: Sync,那么將 &T 傳到另一個(gè)線程中時(shí),不會(huì)導(dǎo)致數(shù)據(jù)競(jìng)爭(zhēng)或其它不安全情況。

  1. Sync 是可以被同時(shí)多個(gè)執(zhí)行體訪問而不出錯(cuò);
  2. Sync 防止的是競(jìng)爭(zhēng);

推論:

  1. T: Sync 意味著 &T: Send;
  2. Sync + Copy = Send;
  3. 當(dāng) T: Send 時(shí),可推導(dǎo)出 &mut T: Send;
  4. 當(dāng) T: Sync 時(shí),可推導(dǎo)出 &mut T: Sync
  5. 當(dāng) &mut T: Send 時(shí),不能推導(dǎo)出 T: Send

(注:T, &T, &mut T,Box<T> 等都是不同的類型)

具體的類型:

  1. 原始類型(比如: u8, f64),都是 Sync,都是 Copy,因此都是 Send
  2. 只包含原始類型的復(fù)合類型,都是 Sync,都是 Copy,因此都是 Send;
  3. 當(dāng) T: SyncBox<T>, Vec<T> 等集合類型是 Sync;
  4. 具有內(nèi)部可變性的的指針,不是 Sync 的,比如 Cell, RefCell, UnsafeCell
  5. Rc 不是 Sync。因?yàn)橹灰蛔?&Rc<T> 操作,就會(huì)克隆一個(gè)新引用,它會(huì)以非原子性的方式修改引用計(jì)數(shù),所以是不安全的;
  6. MutexRWLock 鎖住的類型 T: Send,是 Sync 的;
  7. 原始指針(*mut, *const)既不是 Send 也不是 Sync;

Rust 正是通過這兩大武器:所有權(quán)和生命周期 + Send 和 Sync(本質(zhì)上為類型系統(tǒng))來為并發(fā)編程提供了安全可靠的基礎(chǔ)設(shè)施。使得程序員可以放心在其上構(gòu)建穩(wěn)健的并發(fā)模型。這也正是 Rust 的核心設(shè)計(jì)觀的體現(xiàn):內(nèi)核只提供最基礎(chǔ)的原語,真正的實(shí)現(xiàn)能分離出去就分離出去。并發(fā)也是如此。

上一篇:編譯器參數(shù)下一篇:條件分支