天天看點

023 Rust死靈書之并發、競争

介紹

本系列錄制的視訊主要放在B站上​​Rust死靈書學習視訊​​

Rust 死靈書相關的源碼資料在https://github.com/anonymousGiga/Rustonomicon-Source

并行和并發

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)]);
}