5个不稳定版本
0.3.0 | 2021年3月28日 |
---|---|
0.2.0 | 2021年3月28日 |
0.1.3 | 2021年3月24日 |
#1541 in 数据结构
53KB
986 行
cycler
一个同时读写的数据结构。
这是一个具有1个写入者和N个读取者的数据同步系统。所有写入者和读取者都可以同时操作数据,并在切换时访问最新版本。这是通过存储N + 2份数据,写入者发布数据的新版本来实现的。这样做的目的是允许读取线程拥有一个不变的最新主数据副本,同时写入者可以同时编辑它。
要求
数据类型必须同时实现ReadAccess
和WriteAccess
,否则访问函数将不可用。这些类型允许读取者查看数据的一个子集,仅用于隐藏只有写入者需要的数据,如用于优化复制的更改日志。如果您不关心访问限制,可以将ReadAccess::Read
和WriteAccess::Write
设置为Self,这样编译器应该会优化它,从而没有任何运行时成本。
优化
关于内存使用的最佳做法是只有一个读取者。必须存在N + 2份数据副本,因为在最坏的情况下,所有N个读取者都在读取不同的副本,而写入者正在完成写入。在这种情况下,正在读取的N份数据副本对写入不可用,最后的更新索引不能写入,因此必须有一个额外的副本。这意味着,如果您只使用单个写入者并分配最小数量的内存,将使用最少的内存。权衡是,如果您有多个以不同速率运行的读取循环,所有循环都将以最慢的速度运行。添加读取者不会增加要复制的数据量,并且可能只会略微增加复制切换之间的时间。这也基于clone_from
想法来克隆值,这不是通过派生通常实现的(Derivative可以为您自动派生)。在这种情况下,这是一个主要的优化机会,您可以测试/跟踪更改以减少复制时间。
许可
以下任一许可下提供
- Apache License,版本2.0 (LICENSE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)
- 麻省理工学院许可证(《LICENSE-MIT》或http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确说明,否则根据Apache-2.0许可证定义的,您有意提交以供包含在作品中的任何贡献,均应按照上述方式双许可,不附加任何额外条款或条件。
依赖项
~480–790KB
~13K SLoC