Winsxs 清理
dism.exe /online /Cleanup-Image /StartComponentCleanup
所有权
- 赋值操作就是所有权转移,转移后原来的变量不能再使用;
- 不加 mut 修饰,变量默认read-only 不能修改,编译不过;
- 函数调用/函数传参 也会发生所有权转移;
- 函数传参需要使用 借用
&
,借用完成后反还所有权; - 在调用函数中,修改变量需要使用可变借用;变量声明、传参、函数声明都要加 mut;
线程安全
- 关键词:线程创建;智能指针;互斥指针;原子计数;锁定变量(共享不可变;可变不共享);
- 线程:
join()
; - 线程间传递所有权:
move ||
; - 智能指针:
- Box 保证分配在堆上;
- Rc 引用计数,单线程,只读;
- Arc 多线程,只读;
- Mutex 互斥指针;
- Rc 不能在多个线程间 move,只能在当前线程使用;
- 在单线程中使用Mutex是危险的,因为没有unsafe和&mut的条件下,就能构造一个死锁;
- 在单线程中,RefCell起到了类似Mutex的作用,而且RefCell不会死锁,只会在编译期报错;
- 单线程中Mutex没有意义。一定能找到方法替代,比如可变引用,Cell,RefCell.
code
- 最后一个函数死锁,程序会一直运行(截图所示);
use std::thread;
use std::rc::Rc;
use std::sync::{
Arc, Mutex};
struct Point {
x: i32,
y: i32,
}
fn simple_ownership() {
let p1 = Point {
x: 25, y: 25 };
// 所有权转移给p2
let p2 = p1;
println!("{} {}", p2.x, p2.y);
// 转移后不能再使用p1:borrow of moved value: `p1`
// println!("{} {}", p1.x, p1.y);
}
fn mutable() {
let mut p1 = Point {
x: 25, y: 25 };
// 不加 mut 变量默认read-only 不能修改,编译不过
// cannot assign to `p1.x`, as `p1` is not declared as mutable
p1.x = 30;
println!("{} {}", p1.x, p1.y);
}
fn simple_borrow() {
let p1 = Point {
x: 25, y: 25 };
// 函数调用也会发生所有权转移
// fun(p1);
fun(&p1);
// 此处p1 不可用;函数调用需要借用,借用完成后反还所有权
println!("{} {}", p1.x, p1.y);
}
fn fun(p: &Point) {
println!("{}", p.x);
}
fn mut_borrow() {
let mut p1 = Point {
x: 25, y: 25 };
// 函数调用也会发生所有权转移
// fun(p1);
fun_mut(&mut p1);
// 此处p1 不可用;函数调用需要借用,借用完成后反还所有权
println!("{} {}", p1.x, p1.y);
}
fn fun_mut(p: