rust 智能指针

这篇博客探讨了Rust编程语言中用于确保数据安全和并发控制的几种机制。Box用于栈上分配并保证唯一所有权,Rc实现引用计数,允许多个单线程所有权,而Arc提供线程安全的多所有权。Mutex通过互斥锁保护数据,确保在同一时间只有一个线程可以修改。这些工具在保证内存安全和避免数据竞争方面发挥关键作用。
摘要由CSDN通过智能技术生成

1,Box

保证分配在堆上,只能有一个拥有所有权

let p1 = T{x:25};//栈上分配,出函数消失

let p1 = Box ::new  T{x:25};

自动 *p 

2,Rc

引用计数,单线程拥有多个所有权,只读

//分配在堆上,单线程,只读,引用计数(引用变成0,会把堆上的内容删除。计数本身不是原子性)

let p1 = Rc ::T{x:25};

let p2 = Rc ::clone(&p1);//克隆

let p3 = Rc ::clone(&p1);

不能多线程共享,不能安全传递

3,Arc

多线程拥有多个所有权,只读

原子性的引用计数,多线程共享读

let p1 = Arc ::T{x:25};

let p2 = Arc ::clone(&p1);//克隆

let h1 = thread::spawn(movw || {

println(" {}  " , p2.x);

});

let p3 = Arc ::clone(&p1);

let h2 = thread::spawn(movw || {

println(" {}  " , p3.x);

});

4,Mutex 互斥指针

保护数据(只能指针本身有锁保护数据,隐藏了),保证只有一个线程操作数据

java是锁代码,它是锁数据

可变不共享,执行时只有一个线程有所有权

Mutex 本身不能被传递

//单线程

let mut p1 = Mutex::T{x:0};

let mut  p2 = p1.lock().unwrap();

p2.x +=1;

println(" {}  " , p2.x);



let h1 = thread::spawn(movw || {

println(" {}  " , p3.x);

});



let h2 = thread::spawn(movw || {

println(" {}  " , p3.x);

});

5,如何保障数据安全修改

Arc(Mutex(data))  --> clone Mutex的所有权 - > 通过Mutex修改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值