首页 > 解决方案 > 获取下一个后遍历一个链接结构释放锁

问题描述

我想遍历每个节点一个锁的树(但它也可能是一个链表)。这个想法是从当前找到下一个节点的id,并在解锁当前之前锁定它。不幸的是,我找不到让借阅检查员高兴的方法。我试着写一个我认为代码可能是什么样子的例子。(游乐场链接

在示例之前,我应该说我找到了一种方法来完成这项工作,方法是使用租用的crate,并使其current成为一个自引用结构,其中包含Arc和互斥守卫(因此不再有借用)。我想知道的是,是否有一些更惯用的方式来做到这一点,而不会带来这种依赖。(或者也许是一些非常短的unsafe代码?)

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

fn main() {
    let mut current: Arc<Mutex<Content>> = get(0);
    let mut current_lock: MutexGuard<Content> = current.lock().unwrap();
    // this should loop 4
    loop {
        let next_node = match *current_lock {
            Content::Next(id) => get(id),
            Content::Terminal => {
                return;
            }
        };
        // acquire the next lock
        let next_lock = next_node.lock().unwrap();
        // release the previous (but after having acquired the new one)
        drop(current_lock);
        // do the same for the next one
        // (but this won't compile)
        current = next_node;
        current_lock = next_lock;
    }
}

fn get(id: u32) -> Arc<Mutex<Content>> {
    // 0 -> 1 -> 2 -> 3 -> 4 -> end
    Arc::new(Mutex::new(if id == 4 {
        Content::Terminal
    } else {
        Content::Next(id + 1)
    }))
}

enum Content {
    Next(u32),
    Terminal,
}

先感谢您。

标签: rust

解决方案


推荐阅读