并发队列+映射在c++中的实现

Implementation of Concurrent Queue + map in c++

本文关键字:实现 c++ 队列 映射 并发      更新时间:2023-10-16

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

我目前正在使用来自www.threadingbuildingblocks.org的tbb::concurrent_bounded_queue(记录在英特尔的开发区(作为一个多线程的单生产者-单消费者进程。队列有市场数据报价对象,而流程的生产者端实际上对时间高度敏感,所以我需要的是一个以市场数据标识符(如USDCAD、EURUSD(为键的队列。Value(通过unique_ptr(指向我为此密钥收到的最新市场数据报价。

所以,让我们假设我的队列有5个元素,用于5个唯一的标识符,突然我们在队列的第三个位置得到了标识符的最新市场数据报价,然后我只存储最新的值,并丢弃以前的值。因此,本质上,我只是将unique_ptr移到该密钥的新市场数据报价中。

它类似于concurrent_bounded_queue<pair<string, unique_ptr<Quote>>>,但键控在对的第一个元素上。

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

我非常感谢在这方面的任何帮助或指导。

谢谢。

首先,我们可以很容易地编写。。。

int idn_to_index(idn); // map from identifier to contiguous number sequence

不管是使用std::map还是std::unordered_map,在排序的std::vector中进行二进制搜索,也就是您自己的逐字符硬编码解析器。。。。

然后生产商可以:

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

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

消费者:

  1. 弹出索引

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

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

TBB提供

  • concurrent_undordered_map:无并发擦除,迭代器稳定,无元素访问保护
  • concurrent_hash_map:具有并发擦除,并发操作使迭代器无效,通过"accessors"对每个元素进行访问管理

所以,如果问题"It's like it is similar to concurrent_bounded_queue<pair<string, unique_ptr<Quote>>> but is keyed on the first element of the pair"意味着建议一个相应的并发关联映射容器,这两个由您服务。基本上,您必须在同时擦除标识符的能力(hash_map(和同时遍历所有元素的能力(unordered_map(之间进行选择。concurrent_hash_map还简化了对元素访问的同步,这看起来对您的情况很有用。

我能够解决以下问题:

我使用tbb库中的queuehashmap。现在,我在queue而不是Quote上推送我的唯一标识符。我的hashmap将我的唯一标识符作为密钥,将报价作为值

因此,当我接收到Quote时,我遍历queue并检查queue是否包含该标识符,如果包含,则我将相应的Quote直接插入到hashmap中,并且不在queue上添加唯一标识符。如果没有,那么我在queue上推送标识符,并在hashmap中推送相应的Quote。这确保了我的queue始终是唯一的标识符集,并且我的hashmap具有可用于该标识符的最新Quote

在消费者端,我弹出queue以获取下一个标识符,并从hashmap中获取该标识符的报价。

这相当快。请让我知道,以防我错过了任何隐藏的问题。