【发布时间】:2013-07-22 17:26:02
【问题描述】:
我的程序从交换中获取了大量数据。数据被解析为刻度对象。典型的滴答声
struct Tick
{
string ID;
int bidprice[5];
int askprice[5];
int totalTradedQuantity;
int totalTradedVolume;
.....
.....
}
此刻度对象已发布到网络并记录在文件中。目前我正在锁定更新tick和发布。
Parser Part:
lock();
tick update
unlock();
Publisher Part:
lock();
tick publish;
unlock();
由于数据的频率很高(每秒 5000 个),我必须为收到的每个数据锁定。会不会导致性能问题?如何避免占用这么多锁。任何人都可以建议具有最少锁定的设计实现。请帮忙。
【问题讨论】:
-
我认为它需要锁定机制。我没有看到任何减少它的选择。如果我没有错,您在内部使用互斥锁机制。如果是这种情况,请使用 try-lock 功能。它至少不会阻塞线程。
-
“tick update”和“tick publish”究竟包含什么。如果您所做的只是将已经准备好的数据复制到某种列表中,那还不错。如果涉及大量工作,那么或许你应该考虑是否可以将部分工作“移出”锁,所以只有最后一步“将数据复制到列表中”。同样对于“tick publish”,仅在您从列表中提取数据时锁定 - 一旦您有一个单独的数据项,您就可以释放锁定。
-
该问题没有关于更新和发布过程的足够信息。它们是否在共享 Tick 实例的单独进程/线程中运行?
-
一个无争议的锁在普通硬件上大约需要 50 纳秒,大概。所以这大约是每秒 0.05% 的开销。哪里来的牛肉?您只是猜测还是实际测量过?
-
每秒 5000 个还不错。以每秒 500,000 的速度,您需要无锁数据结构。
标签: c++ multithreading locking