rust 所有权 借用 线程安全


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: 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值