如何确保 N 个线程以大致相同的速度运行?

2022-09-03 08:51:03

我正在考虑编写一个物理模拟软件,其中每个物理元素都将在自己的线程中进行模拟。

这种方法有几个优点。从概念上讲,它将非常接近现实世界的运作方式。将系统扩展到多台计算机会容易得多。

但是,为了做到这一点,我需要确保所有线程都以相同的速度运行,并对“相同”进行相当自由的解释。说在彼此的1%以内。

这就是为什么我不一定需要一个类似Thread.join()的解决方案。我不想要一些超级控制的学校情妇,确保所有线程定期彼此同步。我只需要能够要求运行时(无论它是什么---Java,Erlang或任何最适合这个问题的东西)以或多或少相等的速度运行线程。

任何建议将不胜感激。

更新 2009-03-16

我要感谢所有回答这个问题的人,特别是所有那些答案基本上是“不要这样做”的人。多亏了大家的评论,我现在更好地理解了我的问题,我不太确定我应该继续我原计划。然而,我觉得彼得的回答是这个问题本身的最好答案,这就是为什么我接受了它。


答案 1

没有协调,你无法真正做到这一点。如果一个元素最终需要比另一个元素更便宜的计算(以一种可能不明显的方式)怎么办?

你不一定需要一个超级控制器 - 你可以为每个线程保留某种步进计数器,并有一个全局计数器指示“最慢”的线程。(当每个线程都完成了一些工作时,它必须检查它是否落后于其他线程,如果是,则更新计数器。如果一个线程注意到它比最慢的线程早了很长一段时间,它可以短暂等待(可能在监视器上)。

只需经常这样做,以避免由于共享数据争用而产生太多开销,我认为它可以很好地工作。


答案 2

您将需要某种同步。CyclicBarrier类有你需要的:

一种同步辅助工具,它允许一组线程全部等待彼此到达公共障碍点。循环管理器在涉及固定大小的线程组的程序中很有用,这些线程组必须偶尔相互等待。该屏障称为循环屏障,因为它可以在释放等待线程后重用。

每次“勾选”后,您可以让所有线程等待其他线程,这些线程的速度较慢。当剩余的线程到达屏障时,它们都将继续。