初学Rust——多线程并发

rust学习材料为官网的《The Rust Programming Language》。本笔记包括第16-17章的内容~

Chapter 16 Fearless Concurrency

本章主要内容有:

  • 如何创建多线程
  • Message-passing concurrency
  • Shared-state concurrency
  • SyncSend 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

  1. 对象要包含数据和行为——Rust符合
  2. 封装——Rust 通过 pub关键字实现,符合
  3. 继承——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;
}

17.3 Implementing an Object-Oriented Design Pattern

初学Rust——多线程并发初学Rust——多线程并发 LiraWang 发布了8 篇原创文章 · 获赞 1 · 访问量 193 私信 关注
上一篇:Rust入坑指南:齐头并进(上)


下一篇:except实现跳板机穿透登陆远程服务器