How to avoid deadlocks?

前端 未结 8 866
隐瞒了意图╮
隐瞒了意图╮ 2021-02-01 03:30

When using multiple threads, shared memory needs to be locked by critical sections. However, using critical sections causes potential deadlocks. How can they be avoided?

8条回答
  •  遥遥无期
    2021-02-01 03:51

    One way is by using a non-blocking locking function. As an example, in rust You could use std::sync::Mutex::try_lock instead of std::sync::Mutex::lock.

    So so if you have this example code:

    fn transfer(tx: &Mutex, rx: &Mutex, amount: i32) -> () {
        let mut tx = tx.lock().unwrap();
        let mut rx = rx.lock().unwrap();
    
        *tx -= amount;
        *rx += amount;
    }
    

    You could instead do something like this:

    fn transfer(tx: &Mutex, rx: &Mutex, amount: i32) -> () {
        loop {
            // Attempt to lock both mutexes
            let mut tx = tx.try_lock();
            let mut rx = rx.try_lock();
    
            // If both locks were successfull,
            // i.e. if they currently are not
            // locked by an other thread
            if let Ok(ref mut tx) = tx {
                if let Ok(ref mut rx) = rx {
                    // Perform the operations needed on
                    // the values inside the mutexes
                    **tx -= amount;
                    **rx += amount;
    
                    // Exit the loop
                    break;
                }
            }
            // If at least one of the locks were
            // not successful, restart the loop
            // and try locking the values again.
    
            // You may also want to sleep the thread
            // here for a short period if You think that
            // the mutexes might be locked for a while.
        }
    }
    

提交回复
热议问题