在多个读者从 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
。
- 您有一个额外的版本用于存储在
Mutex
中的更新。
- 当您希望更新数据时,锁定互斥锁并进行更改。
- 复制存储在
Mutex
中的对象并将其放入 ArcSwap
。
- 然后解锁互斥。
任何希望读取数据的代码都将从 ArcSwap
中获取一个克隆,并且永远不会触及 Mutex
。在 Arc
与新版本交换后解锁互斥锁很重要。
我知道我可以使用 RwLock 来等待读取线程完成读取,虽然我想知道是否可以在读取器非原子读取时写入数据(我真的不关心读取器是否得到一个数据的旧副本或新副本,只要内存得到更新) 这可能是安全的(或不安全的生锈)吗?
关于我的具体问题的更多信息:我有一个对象可能需要很长时间才能写入,但我想让读者不断地从中读取。
编辑:更具体地说,我有一个包含不同对象的缓存。这些对象只包含一个字节 (u8) 数组。这个字节数组需要从不同的线程读取以及写入(写入解析一个大而繁琐的结构并将各种字段转换为字节数组)。
这是 arc-swap
crate, which allows you to atomically swap one Arc
另一个很好的用例。每次您希望创建数据的新版本时,您都会创建数据的克隆并将新版本放入 Arc
,换出旧版本 Arc
。需要阅读的代码可以克隆到 ArcSwap
当前的 Arc
,一旦旧版本没有句柄,旧版本就会被销毁。
如果您需要从多个地方修改数据,您应该使用以下模式使用 Mutex
。
- 您有一个额外的版本用于存储在
Mutex
中的更新。 - 当您希望更新数据时,锁定互斥锁并进行更改。
- 复制存储在
Mutex
中的对象并将其放入ArcSwap
。 - 然后解锁互斥。
任何希望读取数据的代码都将从 ArcSwap
中获取一个克隆,并且永远不会触及 Mutex
。在 Arc
与新版本交换后解锁互斥锁很重要。