当多个读者从Rust中的不同线程中阅读时进行写作



我知道我可以使用RwLock来等待读取线程完成读取,尽管我想知道是否可以在读卡器非原子读取时写入数据(我真的不在乎读卡器是得到数据的旧副本还是新副本,只要内存得到更新(这在安全的(或不安全的锈蚀(中可能吗?

关于我的具体问题:我有一个对象可能需要很长时间才能写,但我想让读者不断阅读。

编辑:更具体地说,我有一个缓存,可以容纳不同的对象。这些对象只是保存一个字节(u8(数组。这个字节数组需要从不同的线程中读取,也需要写入(写入过程解析一个庞大而笨重的结构,并将各种字段转换为字节数组(。

这是arc-swap机箱的一个很好的用例,它允许您原子地将一个Arc交换为另一个。每次您希望创建数据的新版本时,都要创建数据的克隆,并将新版本放入Arc中,以替换旧的Arc。需要读取的代码可以获得当前在ArcSwap中的Arc的克隆,一旦旧版本没有更多句柄,旧版本就会被销毁。

如果需要从多个位置修改数据,则应使用Mutex使用以下模式。

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

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

相关内容

  • 没有找到相关文章

最新更新