我不太擅长数据结构,所以这可能是个很愚蠢的问题。我正在寻找一种方法来实现队列 + 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
,您自己的逐字符硬编码解析器....
然后生产者可以:
更新(使用互斥体)
std::vector<unique_ptr<Quote>>
在[idn_to_index(idn)]
将索引发布到
concurrent_bounded_queue<int>
消费者:
弹出索引
比较
std::vector<unique_ptr<Quote>>
中的指针在 [index] 到它自己的最后一次看到的指针数组,如果它们不同,则处理引用
这里的想法不是避免在队列中有重复的特定于标识符的索引,而是确保那些中最旧的仍然触发对最新报价的处理,并且不那么陈旧的队列条目被无害地忽略,直到数据真的又更新了。
关于c++ - C++中Concurrent Queue + map的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25027353/