线程安全的内部可变性包括Mutex、RwLock和Atomic*
1.Mutex一次只允许一个线程,可以被认为只提供可变引用。
2.RwLock允许多个读者或一个作者
3.Arc是线程安全版本的Rc
4.在Rust中,我们锁定的是数据,而不是代码。
Atomic类型依赖于汇编指令来防止数据竞争
AtomicBool 布尔类型
AtomicSize 有符号整数类型
AtomicUsize 无符号整数类型
AtomicPtr 原始指针类型
多线程中使用Arc<RwLock<T>>
代替Rc<RefCell<T>>
示例代码:
1.Atomic
use std::sync::atomic::{AtomicUsize, Ordering};
fn main() {
let num = AtomicUsize::new(0);
num.fetch_add(1, Ordering::Relaxed);
// 1
println!("{:?}", num);
}
2.RwLock
use std::sync::RwLock;
fn main() {
let r = RwLock::new(0);
// 0
println!("{}", r.read().unwrap());
*r.write().unwrap() = 1;
// 1
println!("{}", r.read().unwrap());
}
3.Mutex
use std::sync::Mutex;
fn main() {
let m = Mutex::new(0);
// 0
println!("{}", m.lock().unwrap());
*m.lock().unwrap() = 1;
// 1
println!("{}", m.lock().unwrap());
}