rust - 获取下一个后遍历一个链接结构释放锁
问题描述
我想遍历每个节点一个锁的树(但它也可能是一个链表)。这个想法是从当前找到下一个节点的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,
}
先感谢您。
解决方案
推荐阅读
- delphi - 从命令行构建时有没有办法自动增加版本号?
- performance - 使一个寄存器依赖另一个寄存器而不改变它的值
- javascript - 嵌套的 ng-repeat - 搜索不起作用
- c++ - 如何使用 C++ 检查应用程序是否在 Windows 中作为进程或服务运行?
- python - 将带有特殊字符的 csv 写入数据库表
- powershell - 使用 start-process 运行 cmd 批处理文件
- acumatica - Acumatica PXCheckUnique - 如何在错误消息上显示重复订单 Nbr
- javascript - 如何使用正则表达式 javascript 在换行后获得结果
- python - 在 XML 文件中查找文本并输出元素
- php - 代码点火器如何访问类中的公共变量。