我正在努力建立2级订单。
我正在使用“并发字典”分别存储出价和提问的数据。
我正在使用UDP侦听器读取数据包数据,在处理完数据包后,我将更新传递给出价/询问字典到任务。
这种方法很好,更新很快,但看起来很笨拙。
当我需要对Orderbook进行任何计算时,我必须锁定它进行计算,考虑到它的并发字典,这似乎是一件坏事。我觉得我正在减慢一切违背目的的事情。
您如何建议我解决锁定问题并减慢更新以对数据进行计算?
抱歉,我目前无法发布代码,但我不能停止思考如何解决这个问题。
答案 0 :(得分:2)
设计已经达到了仅使用一个数据仓的局限性。因此,我建议更改设计以容纳两个孤岛和数据管理器。
主要目标应该是及时但安全地进行所需的计算操作,然后专注于任何不应被阻止的数据输入。
在这个设计中有三个线程,一个管理器和两个数据孤岛。
ConcurrentQueue
的帖子会将所有传入数据enqueue存储到ConcurrentQueue Class。该存储孤岛将以 FIFO 方式处理数据的并发需求。
第二个线程运行一个数据管理器单例,它将 smurf (TryDequeue)数据从数据输入Orderbook
转移到最终的孤岛。由于传入数据位于队列中,因此可以节流穿过此虚拟网桥的记录总数,以达到可以测量/监控的标准性能。
while (file >> ss) {
if (isalpha((unsigned char)ss[0])
names.push_back(ss);
else {
std::istringstream buf(ss);
int n;
while (buf >> n)
numbers.push_back(n);
}
}
)求和操作的最后一个线程是数据最终驻留的位置。数据本身可以是标准字典,它将由数据管理器或求和过程锁定。然后,可以通过数据管理器改变访问优先级以支持求和过程,反之亦然;这将取决于该行动的最终需求。
通过该设计,数据输入被解锁,并且求和操作优先于测量方式的数据输入。