Appearance
智能指针
Box/RC/Arc/Mutex
Box<T> - 堆上分配数据
rust
fn main() {
let a = Box::new(5);
println!("{}", a);
}Rc<T> - 单线程引用计数
rust
use std::rc::Rc;
fn main() {
let a = Rc::new(5);
let b = Rc::clone(&a);
println!("{} {}", a, b);
}注意:Rc只能用于单线程,跨线程使用需用Arc。
Arc<T> - 多线程原子引用计数
rust
use std::sync::Arc;
use std::thread;
fn main() {
let a = Arc::new(5);
let a_clone = Arc::clone(&a);
let handle = thread::spawn(move || {
println!("{}", a_clone);
});
handle.join().unwrap();
}注意:Arc是线程安全的,但内部数据不可变。若需修改,需配合Mutex。
Mutex<T> - 互斥锁
rust
use std::sync::Mutex;
use std::thread;
fn main() {
let m = Mutex::new(5);
{
let mut num = m.lock().unwrap();
*num = 10;
}
println!("{:?}", m);
}Arc + Mutex 多线程共享可变数据
rust
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
let data = Arc::new(Mutex::new(0));
let data_clone = Arc::clone(&data);
let handle = thread::spawn(move || {
let mut d = data_clone.lock().unwrap();
*d += 1;
});
handle.join().unwrap();
println!("{}", data.lock().unwrap());
}注意事项:
- Arc实现了Clone,但clone只是增加引用计数
- Mutex的lock会阻塞当前线程,获取后记得释放(RAII自动释放)
- 尽量缩小锁的范围,避免性能问题