【问题标题】:Searchable Ring Buffer可搜索的环形缓冲区
【发布时间】:2013-03-27 19:47:59
【问题描述】:

我想知道是否有人可以建议一个 c++ 数据结构,它具有环形缓冲区的功能(保证有限存储),但同时允许对环形缓冲区进行有效的线程安全搜索以查找指定数据?

【问题讨论】:

  • 你能给我们一个用例吗?可能有更好的方法来做到这一点。
  • 我已经使用 boost::multi_index 实现了这一点。见:boost.org/doc/libs/1_53_0/libs/multi_index/doc/index.html
  • 当然,我收到了 MarketDataDepth(MDD - 多个出价和询价)。每个 MDD 都由 unint64_t、MDDTag 标记。我需要存储一些 MDD(因此是 RingBuffer),然后如果需要发送订单,则会给出 MDDTag,并且我需要找到由该 MDDTag 映射的 MDD 以从中提取某些属性MDD,因此需要有效地搜索 RB。
  • 由于数据可以在RingBuffer被搜索的同时进来,所以整个事情需要是线程安全的。
  • @user1676605:据我所知,环形缓冲区中的溢出是下一个写指针等于读指针时。 IE,缓冲区已满。

标签: c++ boost data-structures stl std


【解决方案1】:

Intel TBB containers 非常适合此类问题。

concurrent_unordered_map 应该适合你的情况,但如果你真的想要一些环结构,你可以使用 concurrent_bounded_queue 并自己推动来模拟环行为(见下文)。但是,使用这种结构,您将获得线性搜索复杂性,而不是地图中的对数复杂性。

template<class T>
struct concurrent_ring : tbb::concurrent_bounded_queue<T>
{
    void push(const T& t) 
    {
        while(!tbb::concurrent_bounded_queue<T>::try_push(t)) 
           pop();
    }
}

【讨论】:

  • 关于您的代码的问题:从 TBB 容器继承可以吗?析构函数似乎不是虚拟的,所以我想从std容器派生时会有类似的风险?
  • 是的,在这种特殊情况下继承是可以的,因为我们只重载了一个函数成员,但是使用concurrent_bounded_queuemember 组合会是一个更好的设计。它只是这样更短^^而且我仍然认为使用地图最适合问题案例。
猜你喜欢
  • 2012-04-04
  • 1970-01-01
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多