我知道我可以使用RwLock来等待读取线程完成读取,尽管我想知道是否可以在读卡器非原子读取时写入数据(我真的不在乎读卡器是得到数据的旧副本还是新副本,只要内存得到更新(这在安全的(或不安全的锈蚀(中可能吗?
关于我的具体问题:我有一个对象可能需要很长时间才能写,但我想让读者不断阅读。
编辑:更具体地说,我有一个缓存,可以容纳不同的对象。这些对象只是保存一个字节(u8(数组。这个字节数组需要从不同的线程中读取,也需要写入(写入过程解析一个庞大而笨重的结构,并将各种字段转换为字节数组(。
这是arc-swap
机箱的一个很好的用例,它允许您原子地将一个Arc
交换为另一个。每次您希望创建数据的新版本时,都要创建数据的克隆,并将新版本放入Arc
中,以替换旧的Arc
。需要读取的代码可以获得当前在ArcSwap
中的Arc
的克隆,一旦旧版本没有更多句柄,旧版本就会被销毁。
如果需要从多个位置修改数据,则应使用Mutex
使用以下模式。
- 您有一个额外的版本,用于存储在
Mutex
中的更新 - 当您希望更新数据时,请锁定互斥锁并进行更改
- 对存储在
Mutex
中的对象进行克隆,并将其放入ArcSwap
中 - 然后解锁互斥锁
任何希望读取数据的代码都将从ArcSwap
获取一个克隆,并且永远不会接触Mutex
。重要的是,在用新版本交换Arc
之后,互斥锁被解锁。