rust学习材料为官网的《The Rust Programming Language》。本笔记包括第16-17章的内容~
Chapter 16 Fearless Concurrency
本章主要内容有:
- 如何创建多线程
- Message-passing concurrency
- Shared-state concurrency
-
Sync
和Send
trait
16.1 Using Threads to Run Code Simultaneously
在你的程序中的不同的,同时进行的进程称为thread。由于threads的运行顺序无法保证,会带来很多问题,例如:
- Race Conditions,线程以不同的顺序访问数据或资源
- Deadlocks,死锁
- Bugs
rust采用1:1的threading
Creating a New Thread with spawn
调用thread::spawn函数,向其传递一个闭包,闭包中包含新thread的代码。
注意当main中的线程结束时,spawn中的会强制结束,无论是否运行完毕。
Waiting for All Threads to Finish Using join
Handles
thread::spawn 的返回类型是JoinHandle。当我们对JoinHandle类型调用join方法时,程序会等待thread::spawn结束运行。
Using move
Closure with Threads
16.2 Using Message Passing to Transfer Data Between Threads
机制:message passing
实现方法:channel:包括transmitter和receiver
称一个channel closed,若transmitter或receiver被drop
16.3 Shared-State Concurrency
Mutex是mutual exclusion的简称,它可以让一个线程在任何时候访问一些数据。为了访问mutex中的数据,线程必须首先发出信号,表示其试图访问数据的lock。两条使用原则:
- 在使用数据之前必须首先尝试访问lock
- 当使用完毕数据时,必须unlock数据,以便其他线程继续访问。
注意,在15章学到的Rc<T>不适用于线程之间的传递,会造成memory leak。因而为了实现与Rc相似的功能,同时保证多线程之间传递的安全性,引入Atomic Reference Counting: Arc<T>
Arc和Rc具有相同的API
16.4 Extensible Concurrency with the Sync
and Send
Traits
自己实现Send 和 Sync traits是不安全的。
Chapter17, Object Oriented Programming Features of Rust
OPP 构建程序的方法
17.1 Characteristics of Object-Oriented Languages
- 对象要包含数据和行为——Rust符合
- 封装——Rust 通过
pub
关键字实现,符合 - 继承——Rust没有继承的功能
17.2 Using Trait Objects That Allow for Values of Different Types
在编译时,run()方法不会去关心具体的类型是什么,只关心这个变量是否实现了trait所要求的性质。只要满足实现了性质,就可以编译执行。
关于安全性:一个trait是object safe的,若所有定义在这个trait上的方法有以下性质:
- 返回类型不是
Self
- 没有generic 类型的参数
像标准库中的Clone trait就不是一个安全的object safe trait:
pub trait Clone {
fn clone(&self) -> Self;
}