中文版《Rust標準庫》來了

====================================
Rust標準庫- 中文版 , 歡迎你們一塊兒來 參與 !!
====================================
Rust標準庫是可移植Rust軟件的基礎,Rust軟件是針對更普遍的Rust生態系統的一組最小且通過測試的共享抽象. 它提供了諸如 Vec<T> 和 Option<T>之類的核心類型, 對語言原語的庫定義操做, 標準宏, I/O 和 多線程, 等等.
Std默認狀況下可用於全部Rust庫. 所以, 標準庫能夠在 use 語句 經過 std路徑訪問, 就像使用use std::env同樣

Rust標準庫之旅

  1. 容器和集合 option 和 result 模塊定義可選和錯誤處理的類型 : Option<T> 和 Result<T, E>. iter 模塊定義Rust的迭代器特質 Iterator, 與for 循環一塊兒使用以訪問集合.
標準庫公開了三種處理內存連續區域的經常使用方法:
  • Vec<T> - 在運行時可調整大小的堆分配向量/vector
  • [T; n] - 在編譯時具備固定大小的內聯數組
  • [T] - 具備容納動態大小切片的任何類型連續存儲, 不管是否進行堆分配
切片只能經過某種指針來處理,所以有多種形式,例如:
  • &[T] - 共享切片
  • &mut [T] - 可變切片
  • Box<[T]> - 擁有切片
str, UTF-8字符串切片是一種原始類型, 標準庫爲此定義了許多方法. Rust str一般被看成不可變的引用: &str來訪問 . 使用擁有/owned String來構造和可變字符串
要轉換爲字符串,請使用 format! 宏;要從字符串轉換,請使用 FromStr 特質.
能夠經過將數據放在引用計數的 box 或 Rc 類型中來共享數據, 若是進一步包含在 Cell 或 RefCell,則能夠對其進行突變和共享. Likewise, in a concurrent setting it is common to pair an atomically-reference-counted box, Arc, with a Mutex to get the same effect.
該collections 模塊定義了 maps , sets , linked lists 和其餘典型的集合類型,包括 HashMap<K, V>.
2. 平臺抽象和 I/O 除了基本數據類型外,標準庫還主要關注常見平臺(尤爲是Windows和Unix派生)中的差別的抽象
常見類型的 I/O, 包括 files, TCP, UDP, 在被定義在 io, fs, 和 net 模塊.
該 thread 模塊包含Rust的線程抽象. sync 進一步包含其餘原始共享內存類型, 包括 atomic 和 mpsc, 其中包含用於消息傳遞的通道類型.

模塊 std::thread

線程模型

正在執行的Rust程序包含一組原生OS線程,每一個原生線程都有本身的堆棧和局部狀態。能夠命名線程,併爲低級同步提供一些內置支持。
線程之間的通訊能夠經過 channels(通道), Rust的消息傳遞類型, 以及 其餘形式的線程同步 和共享內存數據結構來完成. 特別是,使用原子引用計數的容器類型 Arc, 可 以在線程之間輕鬆共享並保證線程安全.
Rust中的致命邏輯錯誤致使線程崩潰,在此期間線程將展開堆棧,運行析構函數並釋放擁有的資源. 儘管這並非一種 'try/catch'機制,但 Rust的恐慌仍然能夠經過catch_unwind捕獲(除了使用`panic=abort`進行編譯 ) 或經過resume_unwind從中恢復. 若是恐慌沒有捕獲線程將退出,但恐慌能夠經過join可選地從其餘線程檢測到. 若是主線程出現恐慌而沒有捕獲到,則應用程序將以非零的退出代碼退出。
當Rust程序的主線程終止時,即便其餘線程仍在運行,整個程序也會關閉。可是,此模塊提供了便利的功能,能夠自動等待子線程的終止(即 join).

產生線程

可使用 thread::spawn函數產生一個新線程:
use std::thread;

thread::spawn(move|| {
    // some work here
});複製代碼
在此示例中,生成的線程是與當前線程 "分離" 的。這意味着它能夠在其父線程(產生它的線程)以外存活,除非該父線程是主線程。
父線程也能夠等待子線程的完成, 調用spawn產生的 JoinHandle,提供了join等待方法:
use std::thread;

let child = thread::spawn(move|| {
// some work here
});
// some work here

let res = child.join();複製代碼
該 join 方法返回一個thread::Result 包含子線程Ok產生的最終值的內容,或者子線程panic!時 返回Err 值來調用panic!。

配置線程

能夠經過Builder類型在產生新線程以前對其進行配置,當前該類型容許您設置子線程的名稱和堆棧大小:
use std::thread;
			
thread::Builder::new().name("child1".to_string()).spawn(move|| {
    println!("Hello, world!");
});複製代碼

Thread 類型

線程經過 Thread類型表示,您能夠經過如下兩種方式之一來獲取:
  • 經過生成一個新的線程,例如,使用的thread::spawn函數,在 JoinHandle上調用thread.
  • 經過請求當前線程,使用thread::current 函數.
該thread::current函數甚至適用於不是由該模塊API產生的線程

線程局部存儲

該模塊還爲Rust程序提供了線程局部存儲的實現。線程局部存儲是一種將數據存儲到全局變量中 的方法,程序中的每一個線程都有其本身的副本。線程不共享此數據,所以不須要同步訪問。
線程局部鍵擁有其包含的值,而且在線程退出時將銷燬該值。它是使用thread_local!宏建立, 能夠包含任何'static(無借入指針)值。它提供了一個訪問器函數,該with函 數 產生對指定閉包的值的共享引用。線程局部鍵僅容許共享訪問值,由於若是容許可變借用,則沒法保證惟一性。大多數值都但願經過Cell 或 RefCell 類型 利用某種形式的內部可變性.

命名線程

線程可以具備關聯的名稱以用於識別。默認狀況下,生成的線程是未命名的。要爲線程指定名稱,請使用Builder構建線程, 並將所需的線程名稱傳遞給Builder::name。要從 線程內部檢索線程名稱,請使用Thread::name。幾個使用線程名稱的地方的例子:
  • 若是命名線程發生panic,則線程名稱將顯示在panic消息中
  • 在適用的狀況下(例如,在類Unix平臺中的pthread_setname_np )將線程名稱提供給OS.

堆棧大小

生成線程的默認堆棧大小爲2 MiB,儘管此特定堆棧大小未來可能會更改。有兩種方法能夠手動指定生成的線程的堆棧大小:
  • 使用Builder構建線程,並將所需的堆棧大小傳遞給Builder::stack_size.
  • 將RUST_MIN_STACK環境變量設置爲表明所需堆棧大小(以字節爲單位)的整數。請注意,設置Builder::stack_size 將覆蓋此設置 .
請注意,主線程的堆棧大小不是由Rust肯定的
相關文章
相關標籤/搜索