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 误用:

  1. 抛弃原始指针

    let a = Arc::new(0u8);
    func(&(a as Arc::new(0u64))); (1)
    1. 此行代码之后,a 的所有权被取走。之后 func 抛弃 a。导致 a 被删除。

进程

Rust 在启动后会为程序安装 SIGCHLD 句柄,回收所有通过标准接口创建的子进程。因此通过标准接口创建的进程需要和标准接口一起使用。

Last moify: 2022-12-04 15:11:33
Build time:2025-07-18 09:41:42
Powered By asphinx