【发布时间】:2014-12-09 07:27:27
【问题描述】:
我正在尝试实现一个环形缓冲区(或循环缓冲区)。与这些实现中的大多数一样,它应该尽可能快速和轻量级,但仍然提供足够的安全性以足够健壮以供生产使用。这是一个很难达到的平衡。特别是我面临以下问题。
我想使用该缓冲区来存储最后 n 个系统事件。随着新事件的出现,最旧的事件被删除。然后我的软件的其他部分可以访问这些存储的事件并按照自己的节奏处理它们。一些系统可能会在事件到达时几乎一样快地消耗事件,而其他系统可能只是偶尔检查。每个系统都会将迭代器存储到缓冲区中,以便它们知道上次检查时离开的位置。这没有问题,只要他们检查得足够频繁,但尤其是速度较慢的系统可能经常会发现自己有一个旧迭代器,该迭代器指向一个缓冲区元素,该元素已被覆盖而无法检测到。
是否有一种很好的(不太昂贵的)方法来检查任何给定的迭代器是否仍然有效?
到目前为止我想出的东西:
- 保留所有迭代器的列表并存储它们的有效状态(相当昂贵)
- 不仅在调用系统中存储迭代器,还在缓冲区客户端中存储指向元素的副本。在每次访问时,检查元素是否仍然相同。这可能是不可靠的。如果元素已被相同元素覆盖,则无法检查它是否已更改。此外,找到检查元素的好方法的责任在于客户,这在我看来并不理想。
许多环形缓冲区实现根本不关心这一点,或者使用单读单写习语,其中读取正在删除。
【问题讨论】:
-
您预计有多少消费者?
标签: c++ iterator containers