因为 Rust 语法的特殊性,Rust 的锁还是比较简单的。
Rust 创建任意一种锁的步骤如下
-
使用
std::sync::Mutex
创建一个读写锁。记住,变量要使用to_owned()
转移所有权 -
使用
std::sync::Arc
创建要在多线程环境中使用的原子性变量arc
。怎么说呢,就是给上面创建的锁添加一个自动引用计数。 -
使用
arc.clone()
或Arc::clone()
方法克隆或复制多个引用变量实例,方便在每个线程中使用一个。 -
在一个新的作用域中,比如多线程或者
{}
中调用arc.lock()
获取锁并操作数据,当然啦,获取锁可能失败。 -
不需要调用
arc.unlock()
,因为 Rust 离开作用域之后就会自动释放锁。
是不是很简单?
写了一个小小的范例
use std::sync::{Arc,Mutex}; use std::thread; //互斥锁范例 fn main() { // 定义一个需要在多线程环境中使用的变量 let s = String::from("你好啊"); // 创建互斥锁,创建时需要转移所有权; let mutex = Mutex::new(s.to_owned()); // 创建原子性操作1 let lock = Arc::new(mutex); // 创建原子性操作2 let lock2 = lock.clone(); // 创建一个线程,然后修改 s let hdl = thread::spawn(move||{ // 获取锁 lock2.lock().unwrap().push_str(" thread "); // 释放锁 // 不用主动释放的原因是,Rust 会记住 lock() 时的作用域,离开作用域会自动释放 }); // 在主线程中操作 // 需要一个块来定义 lock() 方法的作用域 { // 获取锁 lock.lock().unwrap().push_str(" main "); // 释放锁 // 不用主动释放的原因是,Rust 会记住 lock() 时的作用域,离开作用域会自动释放 } hdl.join().unwrap(); println!("{:?}",lock); }
目前尚无回复