面试题答案
一键面试设计思路
- 错误类型定义:定义一个自定义错误类型来处理并发冲突和异步相关错误。
- 并发控制:使用
Mutex
或RwLock
来保护Vec
集合,以防止并发冲突。同时,利用async
和await
处理异步操作。 - 异步操作:将元素添加和删除操作封装成异步函数,在函数内部进行错误处理。
核心代码片段
use std::sync::{Arc, Mutex};
use std::error::Error;
use futures::executor::block_on;
// 定义错误类型
#[derive(Debug)]
enum VecError {
ConcurrentAccessError,
OtherAsyncError,
}
impl Error for VecError {}
// 封装异步添加操作
async fn add_element(vec: Arc<Mutex<Vec<i32>>>, element: i32) -> Result<(), VecError> {
let mut guard = vec.lock().map_err(|_| VecError::ConcurrentAccessError)?;
guard.push(element);
Ok(())
}
// 封装异步删除操作
async fn remove_element(vec: Arc<Mutex<Vec<i32>>>, index: usize) -> Result<(), VecError> {
let mut guard = vec.lock().map_err(|_| VecError::ConcurrentAccessError)?;
if index < guard.len() {
guard.remove(index);
Ok(())
} else {
Err(VecError::OtherAsyncError)
}
}
使用示例
fn main() {
let vec = Arc::new(Mutex::new(vec![1, 2, 3]));
let vec_clone = vec.clone();
let add_result = block_on(add_element(vec, 4));
match add_result {
Ok(_) => println!("Element added successfully"),
Err(e) => println!("Error adding element: {:?}", e),
}
let remove_result = block_on(remove_element(vec_clone, 1));
match remove_result {
Ok(_) => println!("Element removed successfully"),
Err(e) => println!("Error removing element: {:?}", e),
}
}
在上述代码中:
VecError
定义了可能出现的错误类型。add_element
和remove_element
是异步函数,使用Mutex
的lock
方法来获取锁,以确保线程安全,同时处理可能出现的锁获取失败错误(并发冲突)。- 在
main
函数中,使用block_on
来执行异步函数,展示了如何调用这些异步操作并处理错误。实际应用中,block_on
可替换为合适的异步运行时。