5个不稳定版本

0.3.0 2021年3月28日
0.2.0 2021年3月28日
0.1.3 2021年3月24日

#1541 in 数据结构

MIT/Apache

53KB
986

cycler

一个同时读写的数据结构。

这是一个具有1个写入者和N个读取者的数据同步系统。所有写入者和读取者都可以同时操作数据,并在切换时访问最新版本。这是通过存储N + 2份数据,写入者发布数据的新版本来实现的。这样做的目的是允许读取线程拥有一个不变的最新主数据副本,同时写入者可以同时编辑它。

要求

数据类型必须同时实现ReadAccessWriteAccess,否则访问函数将不可用。这些类型允许读取者查看数据的一个子集,仅用于隐藏只有写入者需要的数据,如用于优化复制的更改日志。如果您不关心访问限制,可以将ReadAccess::ReadWriteAccess::Write设置为Self,这样编译器应该会优化它,从而没有任何运行时成本。

优化

关于内存使用的最佳做法是只有一个读取者。必须存在N + 2份数据副本,因为在最坏的情况下,所有N个读取者都在读取不同的副本,而写入者正在完成写入。在这种情况下,正在读取的N份数据副本对写入不可用,最后的更新索引不能写入,因此必须有一个额外的副本。这意味着,如果您只使用单个写入者并分配最小数量的内存,将使用最少的内存。权衡是,如果您有多个以不同速率运行的读取循环,所有循环都将以最慢的速度运行。添加读取者不会增加要复制的数据量,并且可能只会略微增加复制切换之间的时间。这也基于clone_from想法来克隆值,这不是通过派生通常实现的(Derivative可以为您自动派生)。在这种情况下,这是一个主要的优化机会,您可以测试/跟踪更改以减少复制时间。

许可

以下任一许可下提供

由您选择。

贡献

除非您明确说明,否则根据Apache-2.0许可证定义的,您有意提交以供包含在作品中的任何贡献,均应按照上述方式双许可,不附加任何额外条款或条件。

依赖项

~480–790KB
~13K SLoC