如何线程间的安全使用同一对象,Arc<T> 提供了一个不错的方案。
Arc<T>共享T的所有权,同一堆空间。调用clone后,产生一个新指针指向这个堆空间中的同一个值。
当给定值最后一个Arc指针销毁后,这堆内存也将被回收。
默认情况下共享引用是不允许mut的,如何想mut可以考虑使用Mutex,RwLock
下面是一个Mutex与Arc的使用例子
use std::sync::{Arc, Mutex};
use std::thread;
use std::sync::mpsc::channel;
const N: usize = 10;
let data = Arc::new(Mutex::new(0));
let (tx, rx) = channel();
for _ in 0..N {
let (data, tx) = (data.clone(), tx.clone());
thread::spawn(move || {
let mut data = data.lock().unwrap();
*data += 1;
if *data == N {
tx.send(()).unwrap();
}
});
}
rx.recv().unwrap();