Rust 通过 spawn 接口创建线程,一般情况下会要求线程函数的所有权:
pub fn spawn<F, T>(f: F) -> JoinHandle<T>
where
F: FnOnce() -> T,
F: Send + 'static, // <- F is bounded by the 'static lifetime
T: Send + 'static,
如果希望使用借用的方式,可以使用 std::thread::scope 实现。
互斥锁
Rust 的互斥锁和 Box 类似,保存了需要被锁保护的值:
use std::sync::Mutex;
fn main() {
let m = Mutex::new(5);
{
let mut num = m.lock().unwrap();
*num = 6;
// 退出作用域后自动解锁
}
println!("{:?}", m);
}
如果持有锁的线程崩溃了,Mutex::lock 方法就会失败。
如果连续两次调用 lock,就会导致死锁 |
共享指针
Arc 是共享指针。下面讲述常见 Arc 误用:
抛弃原始指针
let a = Arc::new(0u8); func(&(a as Arc::new(0u64))); (1)
此行代码之后,a 的所有权被取走。之后 func 抛弃 a。导致 a 被删除。
进程
Rust 在启动后会为程序安装 SIGCHLD 句柄,回收所有通过标准接口创建的子进程。因此通过标准接口创建的进程需要和标准接口一起使用。