c++ - C++中Concurrent Queue + map的实现

标签 c++ multithreading data-structures concurrency tbb

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

我目前正在使用 tbb::concurrent_bounded_queue (记录在 Intel's developer zone )来自 www.threadingbuildingblocks.org在多线程单生产者单消费者进程中。该队列具有市场数据报价对象,并且流程的生产者端实际上对时间高度敏感,因此我需要的是一个以市场数据标识符(如 USDCAD、EURUSD)为键的队列。 Value 指向(通过 unique_ptr )我收到的有关此 key 的最新市场数据报价。

所以,假设我的队列有 5 个元素对应 5 个唯一标识符,突然我们在队列中的第 3 个位置获得标识符的更新市场数据报价,然后我只存储最新的值并丢弃我之前拥有的值.所以,基本上我只是将我的 unique_ptr 移动到这个 key 的新市场数据报价。

好像和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. 更新(使用互斥体)std::vector<unique_ptr<Quote>>[idn_to_index(idn)]

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

消费者:

  1. 弹出索引

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

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

关于c++ - C++中Concurrent Queue + map的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25027353/

相关文章:

c++ - 通过索引标签描述 boost multi_index 迭代器类型

c++ - 编写类似netstat的程序

安全 dao 的 Java 指南/提示

android - 从另一个 AsyncTask 调用 AsyncTask

c++ - 恒定时间级联计算是否可能?

c - 从列表中删除重复元素的最有效方法

c++ - 在线性时间内找出排序 vector 中是否有一对相加等于某个值

c++ - 同一文件中已有变量的 undefined reference 链接器错误

多线程与共享内存

c++ - C:数据结构对齐