====================================
====================================
Rust標準庫是可移植Rust軟件的基礎,Rust軟件是針對更普遍的Rust生態系統的一組最小且通過測試的共享抽象. 它提供了諸如 Vec<T> 和 Option<T>之類的核心類型, 對語言原語的庫定義操做, 標準宏, I/O 和 多線程, 等等.
Std默認狀況下可用於全部Rust庫. 所以, 標準庫能夠在 use 語句 經過 std路徑訪問, 就像使用use std::env同樣
Rust標準庫之旅
-
容器和集合 option 和 result 模塊定義可選和錯誤處理的類型 : Option<T> 和 Result<T, E>. iter 模塊定義Rust的迭代器特質 Iterator, 與for 循環一塊兒使用以訪問集合.
切片只能經過某種指針來處理,所以有多種形式,例如:
-
&[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::current函數甚至適用於不是由該模塊API產生的線程
線程局部存儲
該模塊還爲Rust程序提供了線程局部存儲的實現。線程局部存儲是一種將數據存儲到全局變量中 的方法,程序中的每一個線程都有其本身的副本。線程不共享此數據,所以不須要同步訪問。
線程局部鍵擁有其包含的值,而且在線程退出時將銷燬該值。它是使用thread_local!宏建立, 能夠包含任何'static(無借入指針)值。它提供了一個訪問器函數,該with函 數 產生對指定閉包的值的共享引用。線程局部鍵僅容許共享訪問值,由於若是容許可變借用,則沒法保證惟一性。大多數值都但願經過Cell 或 RefCell 類型 利用某種形式的內部可變性.
命名線程
線程可以具備關聯的名稱以用於識別。默認狀況下,生成的線程是未命名的。要爲線程指定名稱,請使用Builder構建線程, 並將所需的線程名稱傳遞給Builder::name。要從 線程內部檢索線程名稱,請使用Thread::name。幾個使用線程名稱的地方的例子:
堆棧大小
生成線程的默認堆棧大小爲2 MiB,儘管此特定堆棧大小未來可能會更改。有兩種方法能夠手動指定生成的線程的堆棧大小: