MST

星途 面试题库

面试题:Rust线程死锁预防的策略实践

在一个较为复杂的Rust多线程程序中,存在多个线程需要获取多个互斥锁(Mutex)。请描述一种基于锁排序的死锁预防策略,并通过代码示例说明如何在Rust中实现,以避免死锁情况的发生。
46.2万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

锁排序死锁预防策略

死锁发生的一个常见原因是多个线程以不同顺序获取锁。锁排序策略要求所有线程以相同顺序获取锁。这样,不会出现循环依赖,从而避免死锁。

Rust代码示例

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

fn main() {
    let mutex1 = Arc::new(Mutex::new(0));
    let mutex2 = Arc::new(Mutex::new(1));

    let mutex1_clone = mutex1.clone();
    let mutex2_clone = mutex2.clone();

    let handle1 = thread::spawn(move || {
        let _lock1 = mutex1_clone.lock().unwrap();
        let _lock2 = mutex2_clone.lock().unwrap();
        println!("Thread 1 acquired both locks");
    });

    let handle2 = thread::spawn(move || {
        let _lock1 = mutex1.lock().unwrap();
        let _lock2 = mutex2.lock().unwrap();
        println!("Thread 2 acquired both locks");
    });

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

在上述代码中,两个线程都先获取 mutex1 再获取 mutex2,通过这种一致的锁获取顺序避免了死锁。如果线程2尝试先获取 mutex2,就可能导致死锁,因为 mutex2 可能已经被线程1获取,而线程1在等待 mutex2 释放之前不会释放 mutex1。按照锁排序策略,所有线程以相同顺序获取锁,死锁风险就消除了。