面试题答案
一键面试- 定义类单元结构体:
struct SharedResource;
- 使用
Arc
和Mutex
来处理并发访问:Arc
(原子引用计数)用于在多个线程间共享数据。Mutex
(互斥锁)用于保护数据,确保同一时间只有一个线程可以访问数据。
use std::sync::{Arc, Mutex}; async fn access_shared_resource(resource: &Arc<Mutex<SharedResource>>) { let mut guard = resource.lock().await; // 在这里对共享资源进行操作 // 例如:*guard = SharedResource; }
- 创建并启动异步任务:
use tokio; fn main() { let shared_resource = Arc::new(Mutex::new(SharedResource)); let resource_clone = shared_resource.clone(); let task1 = tokio::spawn(async move { access_shared_resource(&resource_clone).await; }); let resource_clone = shared_resource.clone(); let task2 = tokio::spawn(async move { access_shared_resource(&resource_clone).await; }); tokio::runtime::Runtime::new().unwrap().block_on(async { task1.await.unwrap(); task2.await.unwrap(); }); }
利用Rust的所有权系统和异步特性确保内存安全和高效并发访问的说明:
- 所有权系统:
Arc
遵循Rust的所有权系统,通过引用计数来管理资源的生命周期。当最后一个Arc
实例被销毁时,其所指向的资源也会被销毁。这确保了内存安全,避免了悬垂指针等问题。Mutex
内部的lock
方法通过MutexGuard
结构体来控制对共享资源的访问。MutexGuard
实现了Drop
trait,当MutexGuard
离开作用域时,会自动释放锁,保证了锁的正确管理,避免死锁。
- 异步特性:
- 在异步函数
access_shared_resource
中,await
操作符允许其他异步任务在等待锁时执行,提高了并发效率。这意味着即使某个任务在等待锁,其他任务也可以继续推进,不会阻塞整个线程。 tokio::spawn
用于创建并启动异步任务,这些任务在tokio
运行时中并发执行,利用了Rust异步编程模型的高效性,同时结合Arc
和Mutex
确保了共享资源的安全访问。
- 在异步函数