MST

星途 面试题库

面试题:Rust字符串值访问安全性与并发编程

在多线程并发环境下,Rust如何保证字符串值访问的安全性?请详细阐述 `Arc<String>` 和 `Mutex<String>` 在这种场景下的作用,并通过一个示例代码展示如何正确使用它们来确保字符串访问的线程安全。
41.0万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

在多线程并发环境下,Rust 通过所有权系统、借用检查以及一些标准库提供的线程安全类型来保证字符串值访问的安全性。

Arc<String> 的作用

Arc 即原子引用计数(Atomic Reference Counting),它允许在多个线程间共享数据。Arc<String> 用于在多个线程间共享一个 String 实例,Arc 内部维护一个引用计数,当引用计数为 0 时,所指向的数据会被自动释放。但 Arc 本身并不提供对数据的独占访问,它只是提供数据的共享机制。

Mutex<String> 的作用

Mutex 即互斥锁(Mutual Exclusion),它用于保证在同一时间只有一个线程可以访问其内部的数据。Mutex<String> 允许线程在访问 String 之前获取锁,访问完成后释放锁,这样就避免了多个线程同时修改 String 导致的数据竞争问题。

示例代码

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

fn main() {
    let shared_string = Arc::new(Mutex::new(String::from("Hello, World!")));

    let mut handles = vec![];
    for _ in 0..10 {
        let string_clone = Arc::clone(&shared_string);
        let handle = thread::spawn(move || {
            let mut string = string_clone.lock().unwrap();
            string.push_str(" from thread");
            println!("{}", string);
        });
        handles.push(handle);
    }

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

在上述代码中:

  1. 首先创建了一个 Arc<Mutex<String>> 类型的 shared_string,它将 String 包裹在 Mutex 中,并通过 Arc 来实现在多个线程间共享。
  2. 在循环中,使用 Arc::clone 创建 Arc 的新引用,并将其传递给新线程。
  3. 在每个线程内部,通过 lock 方法获取 Mutex 的锁,如果获取成功(返回 Result,这里使用 unwrap 简单处理错误),则可以安全地修改 String
  4. 最后,等待所有线程完成。

这样通过 Arc 实现数据共享,通过 Mutex 保证同一时间只有一个线程可以访问数据,从而确保了字符串访问的线程安全性。