【问题标题】:Observe size of lockfree queue观察无锁队列的大小
【发布时间】:2015-02-18 21:57:02
【问题描述】:

全部

我正在尝试使用 boost 库的无锁队列数据结构。

#include <boost/thread/thread.hpp>
#include <boost/lockfree/queue.hpp>

但是,我发现这些数据结构不支持获取当前条目数量的方法(http://www.boost.org/doc/libs/1_53_0/doc/html/boost/lockfree/queue.html)。

我想要的是类似于 std::queue::size (http://en.cppreference.com/w/cpp/container/queue/size) 的东西。

非常感谢您提前提供的帮助!

【问题讨论】:

  • 并发数据结构没有大小。想想看。或者,如果这真的让您感到不安,请考虑所有并发数据结构的大小为 17。
  • @MichaelGazonda 这使得它的大小成为一个毫无用处的概念。
  • @juanchopanza 一点也不。仅仅因为容器没有以 100% 的准确率报告大小并不意味着它没有用。有时,知道一个大概的大小总比什么都不知道要好。
  • @MichaelGazonda:对于报告为“大小”的任何值,您无能为力。任何价值都与其他价值一样好。
  • 真的很欣赏所有精彩的论点。 “没有dude”这些天令人信服。

标签: c++ multithreading boost


【解决方案1】:

如果您只想跟踪高/低水位线,请使用一个原子计数器,在您入队时递增,在出队时递减。

您可以定期对该计数器进行采样,以进行您可能需要的任何调整/统计分析。

队列本身不提供此操作,因为您只需为需要的部分付费。

【讨论】:

  • 为了确定的是,没有任何形式的保证单独保存的计数器显示一个有意义的数字。如果入队和增量之间有很大的停顿,而出队和减量之间没有停顿,您甚至可以有负大小。这都是近似的和最大的努力。在这一点上,您最好只保留两个单独的递增计数器,一个用于“产生的工作”,一个用于“消耗的工作”,并监控它们。
  • @KerrekSB 只要将样本偏差和测量误差考虑在内,统计数据就很有意义。即便如此,在从中导出平滑/校正信息时它可能更有用。从技术上讲,您当然是正确的
  • 查看我的编辑;对于统计数据,我会衡量我的“跟上能力”,而不是特定的容器大小。是的,统计数据非常重要。
  • @KerrekSB:首先递增,然后入队。首先出队,然后递减。原子操作不能重新排序,对吧?那么没有负尺寸。
  • @RomanL 取决于内存排序。但默认情况下,你就在那里。当然不会使数字准确。我宁愿消极而不是不必要的偏见。
猜你喜欢
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-21
  • 2011-03-08
  • 1970-01-01
  • 2011-08-30
相关资源
最近更新 更多