【发布时间】:2010-12-03 23:19:01
【问题描述】:
正如answer 到我的question 中所述,我将使用向量来调整大小为 N,读取和写入 n
附:很少需要调整大小和块复制。
编辑: 正如 David Rodríguez - dribeas 所要求的,这是一个技术分析程序。历史股票价格保存为向量中的 OHLC 条。所以我真的需要将元素存储在向量中。还有一些其他的计算类称为指标,根据股票价格进行计算。当一个新的价格通过 tcp 到达时,股票首先更新它的 bar 并立即调用它所有相关指标的计算方法,说,“好吧,伙计们,我的第 n 条 bar 已经在这个特定的时间更新了。你自己去计算吧。”所有操作都是基于任务的,也就是说,在完成最后一次更新之前,股票永远不会自我更新,同样,当最后一次更新正在进行时,指标永远不会进行计算。一次一项任务。如果新的更新来得太快,它们可以被缓存为任务。因此,股票可以等待其最后一次更新完成,并且指标可以在计算时类似地存储其任务,但股票不能等待其指标完成其工作。这就是问题的开始。如果更新到达,股票首先查看其条形矢量大小并检查是否必须调整大小。如果需要,它会调整其向量的大小,而在上一次更新之前可能有一些指标仍在工作。指标可能会到达其股票数据,因为数据可能会被调整大小。到目前为止,我没有任何问题,因为指标计算已经非常非常快地完成了。但我很担心。作为一种解决方案,股票可以生成第二个更大的条形向量,并告诉其指标它们可以到达第二个向量以进行后续计算。最终,几秒钟后,对第一个向量的所有访问都消失了,它可以被逐渐删除。
【问题讨论】:
-
正如我在 cmets 中对我的回答所解释的那样,您不能将元素从一个线程插入向量并从另一个线程中的同一向量读取元素。向量重新分配不是唯一的问题;向量执行的内部簿记也是一个问题,您不能对其中涉及的内容做出任何假设。一旦您向消费者线程授予对向量的访问权限,您就不能再次修改它,除非(a)您同步对它的访问,您说过您不想这样做,或者(b)您让所有消费者停止访问向量,这可能很困难。
-
为了在多线程环境中获得最佳性能,您可能需要考虑实现自己的容器。
-
@James McNellis:内部簿记是什么意思?
-
@Bahadir Turkmen:向量必须以某种方式跟踪其大小和容量。有两种典型的实现方式:一种使用存储大小和容量的两个整数;另一种使用存储大小和容量的整数。另一个使用两个指针,一个指向当前数据末尾的元素(指示大小),另一个指向基础数组末尾的元素(指示容量)。任何插入向量都会修改大小。大小也可以被vector的任何成员函数读取,包括
operator[]。 -
@James McNellis:我明白了,所以我需要一个在到达元素时不检查其大小的容器。我还保证自己所需的索引在 [0,n] 的范围内。所以我根本不需要使用向量。我可以很容易地设计一个数组来抓取它的元素,即使是多线程的情况。你这么认为吗?