tft每日頭條

 > 科技

 > rust 多線程 隊列

rust 多線程 隊列

科技 更新时间:2026-05-08 18:16:31

  昨天在Rust 編程學習筆記Day 5 -借用or引用 Borrow語義 中,我們發現一個問題:一旦 data 離開了作用域被釋放,如果還有引用指向 data,就會造成我們想極力避免的使用已釋放内存(use after free)這樣的内存安全問題,該怎麼辦呢?這就引出了我們今天的主角。

  借用的生命周期及其約束 所以在對值的引用也要有約束:借用不能超過值的生存周期。什麼意思呢?說人話就是,生命周期短的可以借用生命周期長的,生命周期長的不能借用短的。

  先看一下以下代碼:

  fnmain(){ letr=local_ref(); println!(r:{:p} } fnlocal_refaai32{ leta=42; &a }

  這個case中,生命周期更長的 main() 函數變量 r ,引用了生命周期更短的 local_ref() 函數裡的局部變量。在Golang裡會自動把a 逃逸到堆上。但是在Rust中是編譯不過去的。因為這樣違背了引用約束。

  好,說到這裡我們還隻是在學到了rust裡的隻讀借用。有些情況我們需要在借用的過程中修改值的内容,這就需要用到可變借用

  可變借用 在沒有引入可變借用之前,因為一個值同一時刻隻有一個所有者,所以如果要修改這個值,隻能通過唯一的所有者進行。但是,如果允許借用改變值本身,會帶來新的問題。我們先看第一種情況,多個可變引用共存

  fnmain(){ letmutdata=vec![1,2,3]; foritemindata.iter_mut(){ data.push(*item 1); } }

  這段代碼中,data.iter_mut() 方法 是 &mut,已經可變借用一次;然後在 {} 中,data.push() 方法 還是 &mut, 在第一次 &mut 期間,又 一次 &mut,在同一作用域下,多個可變引用,這是不合法的。Rust 編譯器阻止了這種情況,上述代碼會編譯出錯。如圖1:

  rust 多線程 隊列(Borrow的生命周期及約束規則)(1)

  說人話就是:在同一作用域下,可變引用超過了一次就會報錯,不能有多個可變引用。

  那如果有一個可變引用和多個隻讀引用,可以嗎?

  fnmain(){ letmutdata=vec![1,2,3]; letdata1=vec![ println!(data[0]:{:p}, foriin0..100{ data.push(i); } println!(data[0]:{:p}, println!(boxed:{:p}, }

  rust 多線程 隊列(Borrow的生命周期及約束規則)(2)

  可以從圖中看到依然報錯。下面我們來總結一下引用的限制。

  Rust 的限制 為了保證内存安全,Rust對可變引用的使用做了嚴格的約束:

  一個作用域内,僅允許一個活躍的可變引用。這裡提到的活躍是指,真正被用來修改數據的可變引用。如果隻定義了,沒有修改數據,則不算活躍的可變引用。在一個作用域内, 活躍的可變引用(寫)和隻讀引用(讀)是互斥的,不能同時存在。 說人話就是:一個可變引用和多個隻讀引用 在一個作用域内,要麼一個可變(寫),要麼多個不變(讀)。這個約束規則和讀寫鎖(RwLock)非常類似,可以類比學習。

  從可變引用的約束我們可以看到,Rust 不但解決了 GC 可以解決的内存安全問題,還解決了 GC 無法解決的問題。在編寫代碼的時候, Rust 編譯器可以像一個老師一樣,不斷提示我們采用最佳方案來碼出安全的代碼。

  其實,我們抛開這些上層的規則,搞清楚數據在堆棧中如何存放,在内存中如何訪問,然後自下而上理解這些概念,才是最佳途徑。

  總結 這2天我們學習了 Borrow 語義,搞清楚了隻讀引用和可變引用的原理,結合前面學習的 Move / Copy 語義,Rust 編譯器會通過檢查,來确保代碼沒有違背這一系列的規則:

  一個值在同一時刻隻有一個所有者。當所有者離開作用域,其擁有的值會被丢棄。賦值或者傳參會導緻值 Move,所有權被轉移,一旦所有權轉移,之前的變量就不能訪問。如果值實現了 Copy trait,那麼賦值或傳參會使用 Copy 語義,相應的值會被按位拷貝,産生新的值。一個值可以有多個隻讀引用。一個值可以有唯一一個活躍的可變引用。可變引用(寫)和隻讀引用(讀)是互斥的關系,就像并發下數據的讀寫互斥那樣。引用的生命周期不能超出值的生命周期。 快速複習:

  rust 多線程 隊列(Borrow的生命周期及約束規則)(3)

  産品經理的需求總是多變的,有時候要滿足産品的需求就要突破“一個隻有一個所有者的限制。具體怎麼做呢?我們明天繼續學習。

  最後老張祝大家 祝春節快樂!身體健康!萬事如意!幸福美滿!

  #我的生活也是頭條##程序員##頭條創作挑戰賽#

  ,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2026 - www.tftnews.com All Rights Reserved