How to Avoid Deadlocks in Rust

Prevent Rust deadlocks by enforcing a consistent lock acquisition order across all threads to eliminate circular wait conditions.

Avoid deadlocks in Rust by enforcing a consistent lock acquisition order across all threads to prevent circular wait conditions. Use std::sync::Mutex with a defined hierarchy, ensuring every thread acquires locks in the same sequence before accessing shared data.

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

fn main() {
    let data1 = Arc::new(Mutex::new(10));
    let data2 = Arc::new(Mutex::new(20));

    let d1_clone = Arc::clone(&data1);
    let d2_clone = Arc::clone(&data2);

    let handle1 = thread::spawn(move || {
        let mut n1 = d1_clone.lock().unwrap();
        let mut n2 = d2_clone.lock().unwrap();
        *n1 += *n2;
    });

    let d1_clone = Arc::clone(&data1);
    let d2_clone = Arc::clone(&data2);

    let handle2 = thread::spawn(move || {
        let mut n1 = d1_clone.lock().unwrap();
        let mut n2 = d2_clone.lock().unwrap();
        *n2 += *n1;
    });

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