鍍金池/ 教程/ Java/ 并行
標(biāo)準(zhǔn)輸入與輸出
消息傳遞
循環(huán)
注釋
Rust for Mac OS
幾種智能指針
Cell, RefCell
trait對象 (trait object)
rust web 開發(fā)
Unsafe、原始指針
Macro
迭代器
函數(shù)
Borrow, BorrowMut, ToOwned
快速上手
二叉樹
編輯器
測試與評測
Deref
安裝Rust
哈希表 HashMap
原生類型
17.錯誤處理
VS Code 安裝配置
動態(tài)數(shù)組Vec
模式匹配
操作符和格式化字符串
Rust for Linux
函數(shù)參數(shù)
Visual Studio
vim/GVim安裝配置
閉包作為參數(shù)和返回值
安全(Safety)
Cow
生命周期( Lifetime )
閉包的實現(xiàn)
所有權(quán)(Ownership)
Atom
將Rust編譯成庫
類型、運算符和字符串
類型系統(tǒng)中的幾個常見 trait
特性
屬性和編譯器參數(shù)
Spacemacs
集合類型
Rust json處理
Heap & Stack
并行
標(biāo)準(zhǔn)庫示例
基本程序結(jié)構(gòu)
鏈表
trait 和 trait對象
前期準(zhǔn)備
代碼風(fēng)格
編譯器參數(shù)
基于語義化版本的項目版本聲明與管理
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)實現(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)鍵字
隊列
目錄操作:簡單grep
語句和表達(dá)式
并發(fā)編程
閉包
測試
閉包的語法
同步
迭代器
String
Send 和 Sync
Rc 和 Arc
屬性
Emacs
優(yōu)先隊列
Prelude
cargo簡介
控制流(control flow)
數(shù)組、動態(tài)數(shù)組和字符串
FFI
模塊和包系統(tǒng)、Prelude
實戰(zhàn)篇
Rust 是一門系統(tǒng)級編程語言,被設(shè)計為保證內(nèi)存和線程安全,并防止段錯誤。作為系統(tǒng)級編程語言,它的基本理念是 “零開銷抽象”。理
運算符重載
Any和反射
rust數(shù)據(jù)庫操作
輸入輸出流
復(fù)合類型
性能測試

并行

并行

理論上并行和語言并沒有什么關(guān)系,所以在理論上的并行方式,都可以嘗試用Rust來實現(xiàn)。本小節(jié)不會詳細(xì)全面地介紹具體的并行理論知識,只介紹用Rust如何來實現(xiàn)相關(guān)的并行模式。

Rust的一大特點是,可以保證“線程安全”。而且,沒有性能損失。更有意思的是,Rust編譯器實際上只有Send Sync等基本抽象,而對“線程” “鎖” “同步” 等基本的并行相關(guān)的概念一無所知,這些概念都是由庫實現(xiàn)的。這意味著Rust實現(xiàn)并行編程可以有比較好的擴(kuò)展性,可以很輕松地用庫來支持那些常見的并行編程模式。 下面,我們以一個例子來演示一下,Rust如何將線程安全/執(zhí)行高效/使用簡單結(jié)合起來的。

在圖形編程中,我們經(jīng)常要處理歸一化的問題: 即把一個范圍內(nèi)的值,轉(zhuǎn)換到范圍1內(nèi)的值。比如把一個顏色值255歸一后就是1。假設(shè)我們有一個表示顏色值的數(shù)組要進(jìn)行歸一,用非并行化的方式來處理非常簡單,可以自行嘗試。下面我們將采用并行化的方式來處理,把數(shù)組中的值同時分開給多個線程一起并行歸一化處理。

extern crate rayon;

use rayon::prelude::*;

fn main() {
    let mut colors = [-20.0f32, 0.0, 20.0, 40.0,
        80.0, 100.0, 150.0, 180.0, 200.0, 250.0, 300.0];
    println!("original:    {:?}", &colors);

    colors.par_iter_mut().for_each(|color| {
        let c : f32 = if *color < 0.0 {
                0.0
            } else if *color > 255.0 {
                255.0
            } else {
                *color
            };
        *color = c / 255.0;
    });
    println!("transformed: {:?}", &colors);
}

運行結(jié)果:

original:    [-20, 0, 20, 40, 80, 100, 150, 180, 200, 250, 300]
transformed: [0, 0, 0.078431375, 0.15686275, 0.3137255, 0.39215687, 0.5882353, 0.7058824, 0.78431374, 0.98039216, 1]

以上代碼是不是很簡單。調(diào)用par_iter_mut獲得一個并行執(zhí)行的具有寫權(quán)限的迭代器,for_each對每個元素執(zhí)行一個操作。僅此而已。 我們能這么輕松地完成這個任務(wù),原因是我們引入了 rayon 這個庫。它把所有的臟活累活都干完了,把清晰安全易用的接口暴露出來給了我們。Rust還可以完全以庫的形式,實現(xiàn)異步IO、協(xié)程等更加高階的并行程序開發(fā)模式。

為了更深入的加深對Rust并發(fā)編程的理解和實踐,還安排了一個挑戰(zhàn)任務(wù):實現(xiàn)一個Rust版本的MapReduce模式。值得你挑戰(zhàn)。

上一篇:unsafe下一篇:實戰(zhàn)篇