如何在rust中实现id锁?

如何在rust中实现id锁?,rust,mutex,Rust,Mutex,我必须锁定由id标识的不同进程 所以我写代码如下: 使用std::collections::HashMap; 使用std::ptr::null; 使用std::sync::{Arc,Mutex,MutexGuard}; pub结构IDMutex{ m:互斥体, } 发布结构IDMutexGuard IDMutexGuard Self{ 让mut-guard:MutexGuard删除IDMutexGuard{ IDMutexGuard::新建(&self,id) } } 它的实现方式类似于标准库

我必须锁定由id标识的不同进程

所以我写代码如下:

使用std::collections::HashMap;
使用std::ptr::null;
使用std::sync::{Arc,Mutex,MutexGuard};
pub结构IDMutex{
m:互斥体,
}
发布结构IDMutexGuard IDMutexGuard Self{
让mut-guard:MutexGuard删除IDMutexGuard{
IDMutexGuard::新建(&self,id)
}
}
它的实现方式类似于标准库的Mutex和MutexGuard,但是有一个id参数,这样我就可以锁定一些id。但是由于借用了一些规则,它没有构建

那么有没有解决这些问题的办法

我知道正确的方法是选择共享状态,然后使用标准库的互斥锁来锁定它们。但由于历史的原因,这确实是一种充满挑战的方式,我希望我将来会这样做

那么有没有解决这些问题的办法

不要在现有的基础上创建自己的MutexGuard。这实际上是不可行的,因为您需要同时返回所拥有的互斥体和互斥体保护,因为后者借用了前者。此外,所拥有的互斥量实际上是从Arc借用的,因此您也需要返回该互斥量。但是返回弧的动作会移动它,这是不允许的,因为这样引用可能会无效

也不要使用低级代码创建自己的MutexGuard,这是可能的,但并不容易

我看到了两种摆脱困境的方法:

  • 使用基于回调的系统,让您的API管理锁,调用方提供一个fn一旦您调用了该信息,这是非常有限的,但对调用方和被调用方来说都非常简单

  • 返回从映射中克隆的
    ,并让调用者处理锁定。这一点非常重要,因为根据设置的设计方式,锁定地图、获取项目,然后在您仍保留项目的同时解锁地图是正常的,这意味着调用方可能希望
    尝试锁定第二个锁


  • 从它来看,我完全不知道你的代码应该做什么,你能添加soe注释吗?你能更详细地解释一下你的用例吗?您正在询问解决问题的具体方法。我觉得这种方式比它需要的更复杂,但如果不了解潜在的问题,就很难判断。锁定一个流程意味着什么?我以前没听过这个短语,谷歌搜索也没有带来任何启发。通常我们谈论锁定资源,比如文件和(线程)共享内存。直观地说,我认为锁定进程意味着暂停它,但我在您的代码中没有看到任何与多进程相关的内容,所以我想我一定是误解了。我可以肯定地说,
    drop(&mut self.local\u guard)
    没有做任何有用的事情。您需要
    std::ptr::drop_in_place
    将防护装置放在指针的另一端,并且需要解除对它的引用。但这也是错误的,因为在
    new
    中,指针被初始化为局部变量的地址,当
    new
    返回时,该地址将被删除。所以这肯定不是你想要的。