Rust 的 Arc<Mutex<T>> 的用法示例源代码

在 Rust 中,Arc<Mutex<T>> 是一种组合类型,它结合了 Arc(原子引用计数)和 Mutex(互斥锁)。Arc 用于在多个所有者之间共享数据,而 Mutex 用于确保在任意时刻只有一个线程可以访问被保护的数据。这种组合类型在并发编程中非常有用,特别是当你需要在多个线程之间安全地共享和修改数据时。

下面是一个使用 Arc<Mutex<T>> 的简单示例,它演示了如何在多线程环境中安全地共享和修改一个整数值:

rust 复制代码
use std::sync::{Arc, Mutex};
use std::thread;
use std::random;

fn main() {
    // 创建一个 Arc<Mutex<i32>>,初始值为 0
    let counter = Arc::new(Mutex::new(0));

    // 创建多个线程,每个线程都会增加计数器的值
    let mut threads = Vec::new();
    for _ in 0..10 {
        let counter = counter.clone();
        let thread = thread::spawn(move || {
            // 获取互斥锁,以便安全地访问和修改计数器的值
            let mut num = counter.lock().unwrap();
            // 随机增加计数器的值
            *num += random::thread_rng().gen_range(1..=10);
        });
        threads.push(thread);
    }

    // 等待所有线程完成
    for thread in threads {
        thread.join().unwrap();
    }

    // 打印最终的计数器值
    let final_count = counter.lock().unwrap();
    println!("Final counter value: {}", *final_count);
}

在这个示例中,我们首先创建了一个 Arc<Mutex<i32>>,其中包含一个初始值为 0 的 i32 类型的计数器。然后,我们创建了 10 个线程,每个线程都会获取互斥锁,以便安全地访问和修改计数器的值。每个线程都会随机增加计数器的值。最后,我们等待所有线程完成,并打印最终的计数器值。

请注意,我们在每个线程中使用 counter.clone() 来获取 Arc<Mutex<i32>> 的一个克隆。这是因为 Arc 允许我们创建多个指向同一数据的引用,而 Mutex 则确保在任意时刻只有一个线程可以访问被保护的数据。这种组合使得 Arc<Mutex<T>> 成为 Rust 中处理并发共享数据的一种强大工具。

相关推荐
初恋叫萱萱7 小时前
深入解析 Rust + LLM 开发:手把手教你写一个 AI 运维助手
运维·人工智能·rust
shimly12345615 小时前
(done) 速通 rustlings(9) 分支跳转
rust
shimly12345620 小时前
(done) 速通 rustlings(4) 变量声明
rust
shimly12345621 小时前
(done) 速通 rustlings(11) 向量vector及其操作
rust
shimly12345621 小时前
(done) 速通 rustlings(3) intro1 println!()
rust
shimly12345621 小时前
(done) 速通 rustlings(12) 所有权
rust
shimly1234561 天前
(done) 速通 rustlings(7) 全局变量/常量
rust
敲敲了个代码1 天前
构建工具的第三次革命:从 Rollup 到 Rust Bundler,我是如何设计 robuild 的
开发语言·前端·javascript·后端·rust
lpfasd1231 天前
Tauri 中实现自更新(Auto Update)
rust·tauri·update
shimly1234561 天前
(done) 速通 rustlings(10) 基本数据类型
rust