[rust]多线程通信之互斥器

5 阅读1分钟

介绍

  1. 通道类似于单所有权,当值被传递到通道后,该值后续无法再被使用。
  2. 互斥器(Mutex)用于在线程之间共享数据时确保互斥访问,避免数据竞态条件。共享数据类似于多所有权,即多个线程可以同时访问相同的内存地址。
  3. 互斥器使用时需要先获取到锁,使用后需要释放锁,离开作用域时自动释放

示例

启动10个线程,对同一个变量进行加1操作

use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    // 创建一个 Arc 包裹的 Mutex,便于在线程间共享
    // Arc: Atomic Reference Counting,即原子引用计数
    let counter = Arc::new(Mutex::new(0));

    // 创建一个向量存放线程句柄
    let mut handles = vec![];

    for _ in 0..10 {
        let counter = Arc::clone(&counter);
        let handle = thread::spawn(move || {
            // 获取锁
            let mut num = counter.lock().unwrap();
            // 修改共享数据
            *num += 1;
            // 离开作用域后锁自动释放
        });
        handles.push(handle);
    }

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

    // 获取最终结果
    println!("结果: {}", *counter.lock().unwrap()); // 输出10
}