并发队列+映射在c++中的实现
Implementation of Concurrent Queue + map in c++
我不太擅长数据结构,所以这可能是一个非常愚蠢的问题。我正在寻找一种实现队列+映射的混合行为的方法。
我目前正在使用来自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
中进行二进制搜索,也就是您自己的逐字符硬编码解析器。。。。
然后生产商可以:
在
[idn_to_index(idn)]
上更新(使用互斥(std::vector<unique_ptr<Quote>>
将索引发布到
concurrent_bounded_queue<int>
消费者:
弹出索引
将
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
库中的queue
和hashmap
。现在,我在queue
而不是Quote
上推送我的唯一标识符。我的hashmap
将我的唯一标识符作为密钥,将报价作为值
因此,当我接收到Quote
时,我遍历queue
并检查queue
是否包含该标识符,如果包含,则我将相应的Quote
直接插入到hashmap
中,并且不在queue
上添加唯一标识符。如果没有,那么我在queue
上推送标识符,并在hashmap中推送相应的Quote
。这确保了我的queue
始终是唯一的标识符集,并且我的hashmap
具有可用于该标识符的最新Quote
。
在消费者端,我弹出queue
以获取下一个标识符,并从hashmap
中获取该标识符的报价。
这相当快。请让我知道,以防我错过了任何隐藏的问题。
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在C++中,如何在类和函数(可能是模板化的)的头中编写完整的实现
- std::random_device是如何实现的