如何使用 Rust 创建死锁?

Ste*_*ack 2 rust

我想知道如何创建死锁。

我试图在 Rust 中创建一个有死锁的程序。

如何创建一个?

tin*_*ino 8

与其他编程语言一样,Rust 可能会出现无声杀手死锁。

如果某个锁定互斥锁的线程正在等待另一个互斥锁,这不是一个好兆头:如果另一个线程无法到来,则第一个互斥锁将永远不会被释放。

use std::{sync::{Mutex, MutexGuard}, thread};
use std::thread::sleep;
use std::time::Duration;

use lazy_static::lazy_static;
lazy_static! {
    static ref MUTEX1: Mutex<i64> = Mutex::new(0);
    static ref MUTEX2: Mutex<i64> = Mutex::new(0);
}

fn main() {
    // Spawn thread and store handles
    let mut children = vec![];
    for i_thread in 0..2 {
        children.push(thread::spawn(move || {
            for _ in 0..1 {
                // Thread 1
                if i_thread % 2 == 0 {
                    // Lock mutex1
                    // No need to specify type but yes create a dummy variable to prevent rust
                    // compiler from being lazy
                    let _guard: MutexGuard<i64> = MUTEX1.lock().unwrap();

                    // Just log
                    println!("Thread {} locked mutex1 and will try to lock the mutex2, after a nap !", i_thread);

                    // Here I sleep to let Thread 2 lock mutex2
                    sleep(Duration::from_millis(10));

                    // Lock mutex 2
                    let _guard = MUTEX2.lock().unwrap();
                // Thread 2
                } else {
                    // Lock mutex 1
                    let _guard = MUTEX2.lock().unwrap();

                    println!("Thread {} locked mutex2 and will try to lock the mutex1", i_thread);

                    // Here I freeze !
                    let _guard = MUTEX1.lock().unwrap();
                }
            }
        }));
    }

    // Wait
    for child in children {
        let _ = child.join();
    }

    println!("This is not printed");
}
Run Code Online (Sandbox Code Playgroud)

哪个输出

Thread 0 locked mutex1 and will try to lock the mutex2, after a nap !
Thread 1 locked mutex2 and will try to lock the mutex1
Run Code Online (Sandbox Code Playgroud)

然后永远等待


phi*_*mue 5

一个非常简单的变体:

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

fn main() {
    let data = Arc::new(Mutex::new(0));
    let d1 = data.lock();
    let d2 = data.lock(); // cannot lock, since d1 is still active
}
Run Code Online (Sandbox Code Playgroud)

  • 我什至认为你的例子中不需要 `Arc` ;仅使用“Mutex”就足够了。 (2认同)