面试题答案
一键面试- RAII(Resource Acquisition Is Initialization)原理:
- 在Rust中,RAII通过结构体的生命周期管理来自动释放资源。当一个拥有资源的结构体离开其作用域时,Rust会自动调用该结构体的
Drop
trait方法来释放资源。
- 在Rust中,RAII通过结构体的生命周期管理来自动释放资源。当一个拥有资源的结构体离开其作用域时,Rust会自动调用该结构体的
- 同步原语与RAII结合:
- Mutex(互斥锁):
Mutex
用于保证同一时间只有一个线程可以访问共享资源。它实现了RAII模式,Mutex<T>
类型本身并不直接包含T
类型的数据,而是通过lock
方法返回一个MutexGuard
类型的智能指针,MutexGuard
拥有对T
的独占访问权。当MutexGuard
离开作用域时,它会自动释放锁。
- RwLock(读写锁):
RwLock
用于读多写少的场景。它也遵循RAII模式,通过read
方法返回一个RwLockReadGuard
智能指针用于读访问,通过write
方法返回一个RwLockWriteGuard
智能指针用于写访问。当这些智能指针离开作用域时,会自动释放相应的锁。
- Mutex(互斥锁):
- 代码框架:
use std::sync::{Arc, Mutex};
use std::thread;
// 假设这是数据库连接池的结构体
struct DatabaseConnectionPool {
// 连接池相关字段
}
// 实现数据库连接池的一些方法
impl DatabaseConnectionPool {
fn get_connection(&mut self) -> String {
"connection".to_string()
}
}
fn main() {
// 使用Arc和Mutex来共享数据库连接池
let pool = Arc::new(Mutex::new(DatabaseConnectionPool {}));
let mut handles = vec![];
for _ in 0..10 {
let pool_clone = pool.clone();
let handle = thread::spawn(move || {
// 获取锁,这里会返回一个MutexGuard,离开作用域时自动释放锁
let mut pool = pool_clone.lock().unwrap();
let connection = pool.get_connection();
println!("Thread got connection: {}", connection);
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
}
在上述代码中,Arc<Mutex<DatabaseConnectionPool>>
使得多个线程可以安全地共享数据库连接池。Mutex
通过lock
方法返回的MutexGuard
实现了RAII,确保在访问完共享资源后自动释放锁,从而避免数据竞争和资源泄漏。如果是读多写少场景,可将Mutex
替换为RwLock
,并使用相应的read
和write
方法获取对应的RwLockReadGuard
和RwLockWriteGuard
来管理读写访问。