MST

星途 面试题库

面试题:Rust线程中死锁问题基础分析

在Rust中,假设有两个线程,线程A持有锁L1并尝试获取锁L2,线程B持有锁L2并尝试获取锁L1,这种情况下会发生死锁。请用Rust代码示例展示这种场景,并说明死锁发生的原因。
16.6万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

Rust代码示例展示死锁场景

use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    let lock1 = Arc::new(Mutex::new(0));
    let lock2 = Arc::new(Mutex::new(0));

    let lock1_clone = lock1.clone();
    let lock2_clone = lock2.clone();

    let thread_a = thread::spawn(move || {
        let _guard1 = lock1_clone.lock().unwrap();
        println!("Thread A acquired lock1");
        let _guard2 = lock2_clone.lock().unwrap();
        println!("Thread A acquired lock2");
    });

    let thread_b = thread::spawn(move || {
        let _guard2 = lock2.lock().unwrap();
        println!("Thread B acquired lock2");
        let _guard1 = lock1.lock().unwrap();
        println!("Thread B acquired lock1");
    });

    thread_a.join().unwrap();
    thread_b.join().unwrap();
}

死锁发生的原因

  1. 资源竞争:线程A和线程B都需要获取lock1lock2这两个资源(锁)。
  2. 持有并等待:线程A已经获取了lock1,然后试图获取lock2,而此时线程B已经获取了lock2并试图获取lock1
  3. 不可剥夺:一旦一个线程获取了锁,其他线程不能强行剥夺该锁。
  4. 循环等待:线程A等待线程B释放lock2,而线程B等待线程A释放lock1,形成了一个循环等待的关系,从而导致死锁。