内容来自杨旭老师 Rust编程语言入门教程(Rust语言/Rust权威指南配套)【已完结】
第15章 智能指针
使用Box在堆上分配数据
使用Box在堆上存储数据
使用装箱定义递归类型
通过Deref trait将智能指针视作常规引用
使用解引用运算符跳转到指针指向的值
把Box当成引用来操作
定义我们自己的智能指针
通过实现Deref trait来将类型视作引用
函数和方法的隐式解引用转换
解引用转换与可变性
借助Drop trait在清理时运行代码
使用std::mem::drop提前丢弃值
基于引用计数的智能指针Rc
使用Rc共享数据
克隆Rc会增加引用计数
RefCell和内部可变性模式
使用RefCell在运行时检查借用规则
内部可变性:可变地借用一个不可变的值
将Rc和RefCell结合使用来实现一个拥有多重所有权的可变数据
循环引用会造成内存泄漏
创建循环引用
使用Weak代替Rc来避免循环引用
第16章 无畏并发
使用线程同时运行代码
使用spawn创建新线程
使用join句柄等待所有线程结束
在线程中使用move闭包
使用消息传递在线程间转移数据
通道和所有权转移
发送多个值并观察接收者的等待过程
通过克隆发送者创建多个生产者
共享状态的并发
互斥体一次只允许一个线程访问数据
RefCell/Rc和Mutex/Arc之间的相似性
使用Sync trait和Send trait对并发进行扩展
允许线程间转移所有权的Send trait
允许多线程同时访问的Sync trait
手动实现Send和Sync是不安全的
如果不用*y,而直接 assert_eq!(5, y)
你无法可变地借用一个不可变的值
只是将借用规则检查 延后到了 运行时阶段
test double: 测试替代。是个通用概念
但Rust std中没有这东西
将RefCell和Rc结合使用,是种常见做法
Rc允许多个所有者持有同一个数据,但只能提供对数据的不可变访问。
如果在Rc中存储RefCell,那么就可以定义出拥有多个所有则,且能够进行修改的值。
—分割线—
除了汇编语言之外,其他语言,包括C和C++,都有或大或小的运行时
新的线程,必须拥有通道发送端的所有权,才能往通道里发送消息
前面一个线程已经把所有权转移了。后面的线程拿不到了
只有实现了Send这个Trait,才能在线程间安全地传递
原文链接: https://dashen.tech/2020/10/21/The-Rust-Programming-Language-配套视频-第15章-第16章/
版权声明: 转载请注明出处.