面试题答案
一键面试- 简述通过
Mutex
实现结构体可变性线程安全控制:- 在Rust中,
Mutex
(互斥锁)用于保护共享数据,确保同一时间只有一个线程可以访问该数据。当一个线程想要访问被Mutex
保护的数据时,它需要先获取锁。如果锁已被其他线程持有,该线程将被阻塞,直到锁被释放。这样就保证了在多线程环境下对共享数据的可变性操作是线程安全的。
- 在Rust中,
- 示例代码:
use std::sync::{Arc, Mutex};
use std::thread;
// 定义包含i32成员的结构体
struct MyStruct {
value: i32,
}
fn main() {
// 使用Arc和Mutex来创建一个线程安全的共享实例
let shared_struct = Arc::new(Mutex::new(MyStruct { value: 0 }));
let mut handles = vec![];
for _ in 0..10 {
let shared_struct_clone = shared_struct.clone();
let handle = thread::spawn(move || {
// 获取锁
let mut my_struct = shared_struct_clone.lock().unwrap();
my_struct.value += 1;
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
// 输出最终的值
let final_value = shared_struct.lock().unwrap().value;
println!("Final value: {}", final_value);
}
在上述代码中:
- 首先定义了
MyStruct
结构体,它包含一个i32
类型的成员value
。 - 使用
Arc<Mutex<MyStruct>>
来创建一个线程安全且可在多线程间共享的MyStruct
实例。Arc
(原子引用计数)用于在多线程环境下共享数据,Mutex
用于保护MyStruct
实例的可变性。 - 在
main
函数中,创建10个线程,每个线程尝试获取锁并修改MyStruct
实例的value
成员。 - 最后等待所有线程执行完毕,并输出
value
的最终值。通过Mutex
的机制,确保了在多线程环境下对MyStruct
实例value
成员的修改是线程安全的。