在没有无限计算资源的情况下,如何在程序中允许循环性的概念



这听起来可能是一个非常奇怪的问题。但我从事的一个项目需要有环形参考。事实上,它们甚至是不可避免的。因为用户可以在GUI中创建自己的循环引用。这绝对是有意的。。。。请不要问为什么,这需要很长时间才能解释。

我发现的所有讨论循环参考的问题、答案和资源都提供了如何避免循环参考的解决方案和方法。但我读过的non-iread包含了一个关于如何在不破坏底层计算资源的情况下制作一个的解决方案。

我看到的问题

在我看来,这样一个循环引用似乎总是有可能完全覆盖底层系统,无论是一台简单的家用计算机还是运行该程序的研究超级计算机。

这是因为我理解所提供的资源总是有限的,但循环引用本质上是无限的。

我看到的可能有问题的资源是:

  • 计算能力(CPU(
  • 工作存储器
  • 数据存储
  • 网络带宽

如何缓解这些问题

缓解措施可以通过确保程序本身只能以非常小的增量方式增加对计算资源的需求来实现。如果有措施实施,根据收集的整个系统作为一个单元的数据,使我们能够决定是否有必要进一步改进,以提高系统的感知质量。它将帮助我们限制对计算资源的需求。

我可以想象,这种封顶的方法之一是引入时间作为限制因素。该程序的设计方式可以是,它只考虑在给定的时间后重新评估"自身"。如果仔细选择这个时间和质量限制来匹配底层计算资源,我觉得循环引用的资源问题可以得到缓解。

代码段

在下面找到一个非常简化的代码段。点1和点2本质上是完全独立的,它们甚至可以在不同的线程上(实际上这是一个想法,但我对多线程的理解不够好,无法决定它是否是一种好方法(。当它们附着在另一个上时,动作首先开始。我不在乎"先这个后那个"的行为是否以特定的方式发生。我唯一关心的是,这两点之间的所有互动都是在未来的某个时候发生的(在它们相遇之后(。

namespace Circularity
{
class Program
{
static void Main(string[] args)
{
Point Point1 = new Point();
Point Point2 = new Point();
Point1.attach(Point2);
}
}
class Point
{
private ulong Value;
public Point()
{
Value = ulong.MaxValue / 2;
}
public void attach(Point otherPoint)
{
if (Value < ulong.MaxValue) Value++;
otherPoint.attach(this);
}
}
}

此代码会立即导致堆栈溢出。但我对Stack的基本概念理解得不够好,无法实现反措施。我已经尝试在这里应用"时间"概念,但堆栈溢出只需要更长的时间。

出现堆栈溢出的原因是递归调用attach,所以只会不断添加堆栈帧,CLR无法处理那么多,而且正如您所看到的,它很快就会达到最大值。这里的一个策略是使用ContinuationPassingStyle,这样就可以避免构建一堆方法调用。

何时以及如何使用连续传递式

最新更新