====================================
====================================
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,尽管此特定堆栈大小未来可能会更改。有两种方法能够手动指定生成的线程的堆栈大小: