MST
星途 面试题库

面试题:Rust线程同步与共享状态处理

假设有多个Rust线程需要访问并修改共享的可变数据,如何使用`Mutex`和`Arc`来保证线程安全?请编写代码示例展示这种机制,并且说明`Arc`和`Rc`的区别在多线程场景下是如何体现的。
11.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

使用MutexArc保证线程安全的代码示例

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

fn main() {
    // 使用Arc来共享数据,Mutex来保护数据的可变性
    let shared_data = Arc::new(Mutex::new(0));

    let mut handles = vec![];
    for _ in 0..10 {
        let data = Arc::clone(&shared_data);
        let handle = thread::spawn(move || {
            let mut num = data.lock().unwrap();
            *num += 1;
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap();
    }

    println!("Final value: {}", *shared_data.lock().unwrap());
}

ArcRc在多线程场景下的区别体现

  1. 线程安全性
    • RcReference Counting)是单线程引用计数类型,它没有实现SendSync这两个trait。这意味着Rc不能在线程间安全地传递,因为它的引用计数操作不是原子的,在多线程环境下可能导致数据竞争。
    • ArcAtomic Reference Counting)是原子引用计数类型,实现了SendSync这两个trait。这使得Arc可以安全地在线程间传递,其引用计数操作是原子的,保证了多线程环境下的安全性。
  2. 适用场景
    • Rc适用于单线程环境中,当你需要在多个所有者之间共享不可变数据,并且希望在所有所有者都丢弃数据时自动释放内存的场景。
    • Arc适用于多线程环境中,当你需要在多个线程之间共享数据时,Arc可以保证引用计数操作的原子性,避免数据竞争,确保线程安全。