在c ++中实现Concurrent Queue + map

Kap*_*rma 6 c++ concurrency multithreading tbb data-structures

我不擅长数据结构,所以这可能是一个非常愚蠢的问题.我正在寻找一种方法来实现队列+映射的混合行为.

我目前正在www.threadingbuildingblocks.org中使用tbb::concurrent_bounded_queue(记录在英特尔开发人员专区)的多线程单一生产者单一消费者流程.队列具有市场数据报价对象,并且流程的生产者方面实际上是高度时间敏感的,因此我需要的是一个键入市场数据标识符的队列,例如USDCAD,EURUSD.价值指向(通过)我收到的此密钥的最新市场数据报价.unique_ptr

所以,让我们说我的队列有5个元素用于5个唯一标识符,突然我们得到队列中第3个位置的标识符的更新市场数据报价,然后我只存储最新的值并丢弃我以前的值.所以,基本上我只是将我的unique_ptr移动到这个密钥的新市场数据报价.

它就像是相似concurrent_bounded_queue<pair<string, unique_ptr<Quote>>>但却被锁定在该对的第一个元素上.

我不确定这是否已经在第三方库中可用(可能是tbb本身),或者如果它是标准数据结构则称它是什么.

我非常感谢对此提供任何帮助或指导.

谢谢.

Ton*_*roy 0

首先,观察我们可以轻松地写...

int idn_to_index(idn); // map from identifier to contiguous number sequence
Run Code Online (Sandbox Code Playgroud)

...如果在已排序的、您自己的逐字符硬编码解析器中使用std::mapor std::unordered_map、二分搜索,那并不重要...std::vector

然后制作人可以:

  1. 更新(使用互斥体)a std::vector<unique_ptr<Quote>>at[idn_to_index(idn)]

  2. 将索引发布到concurrent_bounded_queue<int>

消费者:

  1. 弹出索引

  2. 将 [index]处的指针std::vector<unique_ptr<Quote>>与它自己的上次看到的指针数组进行比较,如果它们不同,则处理引用

这里的想法不是避免队列中出现重复的特定于标识符的索引,而是确保其中最陈旧的索引仍然会触发对最新报价的处理,并且在数据真正更新之前,不太陈旧的队列条目会被无害地忽略再次。