023 Rust死靈書之併發、競爭

linghuyichong發表於2021-05-07

本系列錄製的影片主要放在B站上Rust死靈書學習影片

Rust 死靈書相關的原始碼資料在github.com/anonymousGiga/Rustonomi...

Rust標準庫中,提供的是作業系統級別的執行緒和阻塞系統呼叫的支援。

資料競爭是指:

兩個或者兩個以上的執行緒併發的訪問同一塊記憶體,兩個執行緒之間是非同步的,並且其中一個執行緒會做寫操作。

資料競爭會導致未定義行為,按照Rust的安全哲學,不允許未定義行為,因此Rust中不允許有資料競爭。

實現的方式:

1、通常情況下,Rust所有權系統就避免了資料競爭(可變引用不存在別名);
2、內部可變性問題,透過Send和Sync trait來保證。

競爭條件指多個執行緒或者程式在讀寫一個共享資料時結果依賴於它們執行的相對時間的情形。

Rust並不會避免一般競爭條件

例子:

use std::thread;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::Arc;
use std::time;

fn main() {
    let data = vec![1, 2, 3, 4];
    let idx = Arc::new(AtomicUsize::new(0));
    let other_idx = idx.clone();

    thread::spawn(move || {
        other_idx.fetch_add(10, Ordering::SeqCst);
    });

    //let ten_millis = time::Duration::from_millis(10);
    //thread::sleep(ten_millis);

    println!("{}", data[idx.load(Ordering::SeqCst)]);
}

註釋開啟和不開啟,結果不一樣。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
令狐一衝

相關文章