12-互斥
8.4.2 互斥
当需要安全地对共享资源进行可变访问时,可以通过互斥来提供访问。互斥锁(mutex)是mutual和exclusion的缩写,是一种广泛使用的同步原语,用于确保一段代码一次只能有一个线程执行。通常,互斥锁是一个守护对象,线程获取该对象以保护要由多个线程共享或修改的数据。它的工作原理是通过锁定值来禁止一次访问多个线程中的值。如果其中一个线程对互斥锁类型执行了锁定,那么任何其他线程都不能运行相同的代码,直到持有该锁定的线程完成为止。
标准库中的std::sync模块包含Mutex类型,允许用户以线程安全的方式改变线程中的数据。
以下代码示例演示了如何在单个子线程中使用Mutex类型:
// mutex_basics.rs
use std::sync::Mutex;
use std::thread;
fn main() {
let m = Mutex::new(0);
let c = thread::spawn(move || {
{
*m.lock().unwrap() += 1;
}
let updated = *m.lock().unwrap();
updated
});
let updated = c.join().unwrap();
println!("{:?}", updated);
}
上述代码能够按照预期正常运行。但是当多个线程尝试访问该值时,这将无效,因为Mutex类型不提供共享可变性。为了允许Mutex类型中的值支持在多线程环境下被修改,我们需要将它包装成Arc类型。接下来让我们看看如何做到这一点。