在多个读者从 Rust 中的不同线程读取时写入

Write while multiple readers are reading from different threads in Rust

我知道我可以使用 RwLock 来等待读取线程完成读取,虽然我想知道是否可以在读取器非原子读取时写入数据(我真的不关心读取器是否得到一个数据的旧副本或新副本,只要内存得到更新) 这可能是安全的(或不安全的生锈)吗?

关于我的具体问题的更多信息:我有一个对象可能需要很长时间才能写入,但我想让读者不断地从中读取。

编辑:更具体地说,我有一个包含不同对象的缓存。这些对象只包含一个字节 (u8) 数组。这个字节数组需要从不同的线程读取以及写入(写入解析一个大而繁琐的结构并将各种字段转换为字节数组)。

这是 arc-swap crate, which allows you to atomically swap one Arc 另一个很好的用例。每次您希望创建数据的新版本时,您都会创建数据的克隆并将新版本放入 Arc,换出旧版本 Arc。需要阅读的代码可以克隆到 ArcSwap 当前的 Arc,一旦旧版本没有句柄,旧版本就会被销毁。

如果您需要从多个地方修改数据,您应该使用以下模式使用 Mutex

  1. 您有一个额外的版本用于存储在 Mutex 中的更新。
  2. 当您希望更新数据时,锁定互斥锁并进行更改。
  3. 复制存储在 Mutex 中的对象并将其放入 ArcSwap
  4. 然后解锁互斥。

任何希望读取数据的代码都将从 ArcSwap 中获取一个克隆,并且永远不会触及 Mutex。在 Arc 与新版本交换后解锁互斥锁很重要。