问题标签 [rwlock]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
58 浏览

rust - 无法使用 RwLock 和 HashMap 向下递归树

我有一个树结构,它在 RwLock 中使用 HashMap 来表示节点的子节点,但是我向下递归树以插入值的方法似乎存在生命周期问题。可以在此处找到更完整的示例,但相关代码如下:

这给了我以下错误:

我已经尝试过诸如this answer中描述的解决方案,但我无法让它工作,可能是因为该过程是迭代的而不是一次性的。我该如何解决这个错误?

0 投票
1 回答
381 浏览

rust - 如何获取对 RwLock 内对象的引用?

此代码有效:

我想摆脱我的程序中的.clone()as foo100MB+,我需要多次引用这个参考。

当我摆脱时,.clone()我得到了错误:

我想序列化foo(从另一个线程,在真实代码中,因此是 Arc)。

我怎样才能得到一个&Foolock,没有浪费.clone()

0 投票
1 回答
262 浏览

rust - RwLockWriteGuard 和 RwLockReadGuard 在同一个变量中?

我目前正在实现一个多客户端键值存储(如 redis 或 memcached),它允许客户端获得对存储的独占访问权限。

现在我遇到的问题是,当从共享存储中获取值时,它可以由 RwLockWriteGoard (当独占访问处于活动状态时)或 RwLockReadGuard 保护时不受保护。

我没有找到一种方法将存储保存在变量中,以便稍后以一种不关心它是否受读或写保护保护的方式对其执行操作。

这是我目前使用的简化解决方案。

如果可能的话,我想把 Command::Get(key) arm 写成这样:

但这不起作用,因为该匹配的两个臂返回不同的类型(RwLockWriteGuard 和 RwLockReadGuard)。

有没有办法解决这个问题,我太盲目了,看不到?

0 投票
1 回答
636 浏览

rust - Rustlazy_static 变量 RwLock 访问

我正在尝试声明和读/写自定义结构的实例,lazy_static因为我必须在其初始化(字符串)时使用非常量函数。

正如我在另一个 Stackoverflow 帖子中看到,我尝试使用 RwLock,它在写入时工作正常,但在读取时失败,并出现以下错误:

0 投票
0 回答
60 浏览

c - 移动命令中的多线程死锁

尝试在 Linux 中为另一个必须是多线程的文件系统实现类似于 move 命令的命令时,我遇到了以下问题。

当我尝试执行以下操作时:'''mv /a /b/a''' 程序正在锁定根目录以进行写入和 a 以进行写入。然后,由于我无法释放锁,因为其他线程可能会获取它们,所以当我尝试锁定根以读取移动命令的目标时,我会陷入死锁情况。

我正在努力解决这个问题的可能解决方案。以我的代码现在的方式,当给定路径 /x/y/z 时,它会锁定每个目录,用于读取或写入,具体取决于我要执行的命令。因此,使用它,我能够确定是否可以将 /a 写入 /b/a,因为它会检查 /a 是否存在以及 /b/a 是否不存在,但我仍然需要解决死锁情况.

0 投票
1 回答
138 浏览

rust - 在可变结构上使用 RwLock.read()

我正在尝试在可变结构周围使用 RwLock,但我无法编译它,我不知道为什么。

这是一个最小的代码示例:

whereLruCache来自外部 Rust 板条箱(但我认为它在问题中没有特定作用)。编译器抱怨此消息:

我检查了文档RwLock,虽然RwLockWriteGuard确实实现了DerefMutRwLockReadGuard但没有。

我对 Rust 很陌生,所以我很确定我做错了什么。有没有办法解决DerefMut必需但未实现的编译器错误?

编辑我更改了代码,以便可以从主文件轻松执行。

0 投票
2 回答
183 浏览

multithreading - Rust 中多个 RwLock::write 的提前停止等待

我的 Rust 代码用于RwLock在多个线程中处理数据。每个线程在使用锁时填充一个公共存储read(例如填充一个数据库,但我的情况有点不同)。最终,公共存储空间将被填满。我需要暂停所有处理,重新分配存储空间(例如从云中分配更多磁盘空间),然后继续。

由于所有线程将在大约同一时间快速耗尽空间,因此它们都可以释放read锁,并获得一个write. 第一个获得write锁的线程将解决存储问题。但是现在我有一个可能的临时死锁情况——所有其他线程也在等待write锁,即使它们不再需要它。

所以这种情况有可能发生:给定 3 个线程都在等待write,第一个线程得到write,修复问题,释放write,并等待read。第二个进入write但很快跳过,因为问题已经修复并发布。第 1 个和第 2 个线程将进入read并继续处理,但第 3 个线程仍在等待write并将等待很长时间,直到前两个线程空间不足或完成所有工作。

鉴于所有线程正在等待write,我如何在第一个线程完成工作后,但在它释放write它已经获得的锁之前“中止”所有其他线程的等待?

我看到有一个poisoning功能,但它是为恐慌而设计的,并且在生产中重用它似乎是错误的并且很难正确完成。Rust 开发人员也在考虑删除它。

PS 每次循环迭代本质上是一个data[index] = value赋值,这里data是一个被许多线程共享的巨大的 memmap。所有线程都在index缓慢增长,因此最终所有线程都用完了 memmap 大小。发生这种情况时,memmap 被销毁,文件重新分配,并创建一个新的 memmap。因此,不可能在每次循环迭代时都获得读锁。

0 投票
1 回答
90 浏览

rust - 获取 Arc 的只读版本>?

我有一个Arc<RwLock<Foo>>.

有没有办法从中做出一些事情,而RwLock's write() 不存在?即是否有某种形式RLock我可以从RwLock.

用例:我有一个Foo. 我的代码中不止一部分需要改变 Foo(因此是 RwLock),但我的大部分代码只能对 Foo 具有只读访问权限。

有没有办法实现这一目标?或者有没有办法做到这一点RwLock

0 投票
0 回答
66 浏览

rust - 如何在 RwLock 中返回对 T 的引用?

我正在使用 leveldb 板条箱,我正在尝试获取一个 Snapshot 结构并将其移动到我的结构中,但是我遇到了问题,因为我无法将引用的值移出函数。

这是来自 crate 的结构和特征的代码。我没有在这里包含它,但是 Database 类型实现了 Snapshots 特征以返回一个快照:

这是我的代码:

我认为我不能这样做的原因(如果我错了,请纠正我)是使用 RwLock,当我获得对包装数据(在我的情况下为数据库)的引用时,该引用的生命周期不是 self 和所以当 RwLock 超出范围时它会被丢弃。我能想到的一种可能的解决方法是删除数据库上的 RwLock 并添加另一个字段:

这将让我安全地获得快照,因为它会阻塞直到任何写锁被释放,并且最终用户除了通过我实现的 API 之外无法改变 ldb,只要我总是在尝试读/写之前使用 ldb_rwlock对 ldb 来说应该是安全的。但是,我觉得这会使 rust 打算使用 RwLock 的方式无效,并且感觉不是很惯用。有没有办法解决这个问题?

另外我不将 ldb 包装在 Arc 中的原因是因为 Cache 结构将被包装在 Arc 中并跨线程共享,我只想要锁定 ldb 字段,以便只有读/写数据库需要锁。不过,总的来说,我对生锈和并发性还是很陌生,所以我不确定我正在做的事情是否是解决这个问题的最佳方法。