MST

星途 面试题库

面试题:Rust锁定场景下获取顺序相关基础实践

在Rust中,假设有两个线程A和B,线程A需要获取锁L1和L2,线程B需要获取锁L2和L1,为了避免死锁并保证获取顺序正确,你会如何设计代码结构?请简要描述思路并给出关键代码片段。
41.7万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

思路

为了避免死锁,确保两个线程以相同的顺序获取锁。可以规定一个固定的锁获取顺序,例如先获取L1再获取L2

关键代码片段

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

fn main() {
    let l1 = Arc::new(Mutex::new(()));
    let l2 = Arc::new(Mutex::new(()));

    let l1_clone = l1.clone();
    let l2_clone = l2.clone();

    let handle1 = thread::spawn(move || {
        let _guard1 = l1_clone.lock().unwrap();
        let _guard2 = l2_clone.lock().unwrap();
        // 线程A的业务逻辑
    });

    let handle2 = thread::spawn(move || {
        let _guard1 = l1.lock().unwrap();
        let _guard2 = l2.lock().unwrap();
        // 线程B的业务逻辑
    });

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

在上述代码中,线程A和线程B都先获取L1,再获取L2,从而避免了死锁。