MST

星途 面试题库

面试题:Rust中Future的状态管理与并发控制

在一个多任务异步场景中,有多个Future任务同时执行。请阐述如何通过`tokio`库来有效管理这些Future的并发执行,并且处理任务间可能出现的资源竞争问题。例如,假设多个任务需要访问并修改同一个共享资源,如何保证数据的一致性和正确性,给出相应的代码架构和关键处理逻辑。
37.9万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 并发执行管理
    • 使用tokio::spawn来创建并并发执行多个Future任务。tokio::spawn将一个Future封装成一个异步任务并在Tokio运行时中调度执行。
    • 例如,假设有两个Future任务future1future2
use tokio;

#[tokio::main]
async fn main() {
    let future1 = async {
        // 任务1的具体逻辑
        println!("Task 1 is running");
    };
    let future2 = async {
        // 任务2的具体逻辑
        println!("Task 2 is running");
    };

    let handle1 = tokio::spawn(future1);
    let handle2 = tokio::spawn(future2);

    handle1.await.unwrap();
    handle2.await.unwrap();
}
  1. 处理资源竞争问题
    • 使用tokio::sync::Mutex来保护共享资源。Mutex(互斥锁)可以保证在同一时间只有一个任务能够访问共享资源,从而避免资源竞争。
    • 以下是一个多个任务访问并修改同一个共享资源的示例代码架构和关键处理逻辑:
use tokio::sync::Mutex;

#[tokio::main]
async fn main() {
    let shared_resource = Mutex::new(0);

    let task1 = async move {
        let mut data = shared_resource.lock().await;
        *data += 1;
        println!("Task 1 modified shared resource to: {}", *data);
    };

    let task2 = async move {
        let mut data = shared_resource.lock().await;
        *data += 2;
        println!("Task 2 modified shared resource to: {}", *data);
    };

    let handle1 = tokio::spawn(task1);
    let handle2 = tokio::spawn(task2);

    handle1.await.unwrap();
    handle2.await.unwrap();
}

在上述代码中:

  • 定义了一个Mutex包裹的共享资源shared_resource
  • 每个任务通过shared_resource.lock().await获取锁,这是一个异步操作,会暂停当前任务直到获取到锁。
  • 一旦获取到锁,就可以安全地访问和修改共享资源,当作用域结束时,锁会自动释放,其他任务就有机会获取锁并访问共享资源,这样就保证了数据的一致性和正确性。