面试题答案
一键面试在多线程并发环境下,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();
}
}
在上述代码中:
- 首先创建了一个
Arc<Mutex<String>>
类型的shared_string
,它将String
包裹在Mutex
中,并通过Arc
来实现在多个线程间共享。 - 在循环中,使用
Arc::clone
创建Arc
的新引用,并将其传递给新线程。 - 在每个线程内部,通过
lock
方法获取Mutex
的锁,如果获取成功(返回Result
,这里使用unwrap
简单处理错误),则可以安全地修改String
。 - 最后,等待所有线程完成。
这样通过 Arc
实现数据共享,通过 Mutex
保证同一时间只有一个线程可以访问数据,从而确保了字符串访问的线程安全性。