如果没有更详细的数据,我已经评论过以任何有意义的方式回答这个问题的难度,但这里有两个提示:
不要经常更新可视化。根据可视化的复杂性,您应该将显示限制为每秒3或5次更新,因此如果建模线程进展得更快,则不要显示每次迭代。您可以让可视化线程每x毫秒请求一个新数据,或者您可以让建模线程在完成后请求新的可视化,并且自上次可视化以来已经过了足够的时间。
如果可以避免,请不要使用锁定。使用不可变数据的共享指针消除了大量的线程争用,因为您不需要锁定对象(所有访问都是只读的)。通过细粒度的类设计,您还将限制将数据复制到那些真正从一个建模循环更改为下一个建模循环的部分的需求。但是,您可能需要对当前设计进行大量更改。不过,我发现这非常值得。
的 编辑: 强> 在编辑之后,我会建议尽可能地消除锁定,因为您希望尽可能快地显示大量数据,但只能更改总数据的5%。
如果您根据修改的数据修改算法从更改单元格到创建新单元格,并且根本不修改模型,而是仅通过将智能指针复制到未修改的单元格并创建新的单元格对象来创建新模型其余的,那么你将不需要锁定几千个对象中的任何一个。完成的模型可以传递给可视化线程,并且可以立即创建新模型。类似地,对于可视化线程及其从模型创建的对象 - 可以将其传递给GUI线程,并从当前模型创建新对象。一些细胞将成为几个模型的一部分,一些细胞将只是一个模型的一部分。用于创建可视化和渲染到输出显示的对象也可以共享单元格。智能指针将确保在删除对它们的最后一个引用时正确释放单元格 - 无论这种情况发生在哪个线程中。
程序中唯一的锁定是每个线程一个顶级锁定,以同步访问当前模型(或其他类似的顶级对象)。由于执行的操作将非常短,因此延迟不再是问题。除此之外,这种设计将最大限度地利用多个处理器或内核,代价是内存消耗略有增加,CPU周期也会增加。然而,这是使软件在当前和未来硬件上表现更好的最佳方式,这种硬件正变得越来越平行。